Попробуйте запустить приложение с FastMM в FullDebugMode. Это больше похоже на ошибку в вашем / стороннем коде lib - возможное перезапись памяти / переполнение буфера (в большинстве случаев, например, sth. GetMem слишком мал для операций типа UnicodeString / String, и он «работает», но рано или поздно вылетит / AV) .
У меня было несколько похожих ситуаций при переносе большого приложения на D2009, и в большинстве случаев это было связано с предположением, что Char = 1 байт. Иногда происходили очень странные вещи, но всегда помогал FullDebugMode. Исключением был CreateProcessW, но это поведение было известно / задокументировано.
С FullDebugMode, если приложение перезаписывает память, а когда вы ее освобождаете, FastMM дает вам исключение в том месте, где оно было выделено, так что вы легко сможете отследить эту ошибку. Он добавляет несколько байтов в начале и в конце выделения, поэтому будет знать, был ли он перезаписан.
Я не могу воспроизвести его с новым / пустым проектом VCL, вы можете попробовать его самостоятельно (этот цикл длится около 5 минут):
uses JwaWtsApi32;
procedure TForm7.FormCreate(Sender: TObject);
var
hServer: DWORD;
begin
while true do
begin
hServer := WTSOpenServer(PChar('server'));
WTSCloseServer(hServer);
hServer := 0;
end;
end;