我正在解決現有代碼始終正常工作的問題(它是Jedi Windows Security Library的Terminal Server unit)。 經過一番調查問題部分已經回落到一個呼叫WTSOpenServer:Windows 7上WTSOpenServer的奇怪崩潰(僅在Delphi 2009/2010中)
while true do
begin
hServer := WTSOpenServer(PChar('server'));
WTSCloseServer(hServer);
hServer := 0;
end;
隨機(但小)數量或運行後,我們得到一個總的應用程序崩潰,這使得它很難調試。 以下是我已經嘗試過的事情:
- WTSOpenServer不寫pServername參數(如CreateProcessW)(其實我查了拆卸和它使一個副本)
- 的代碼運行正常傳遞時零作爲參數(並因此與本地機器一起工作)。
- 當使用遠程服務器,本地主機甚至虛擬爲pServerName時,結果總是崩潰(在Vista及更高版本上,即使無效的服務器名稱也會根據文檔返回有效的句柄)。
- 使用Delphi 2009和2010進行了測試
- 相同的代碼在Visual Studio(C++)中運行良好。
經過在Visual Studio中拆卸和進行呼叫的WTSOpenServer在距離Delphi ASM(和用C改變手柄類型爲指針等):
hModule := LoadLibrary('wtsapi32.dll'); if hModule = 0 then Exit; WTSOpenServer := GetProcAddress(hModule, 'WTSOpenServerW'); if WTSOpenServer = nil then Exit; while true do begin asm push dword ptr pServerName; call dword ptr WTSOpenServer; mov [hServer], eax; end; hServer := nil; end;
離開了呼叫WTSCloseServer
- 測試在Windows 7的兩個x64和x86版本的代碼
- 使用外部調試器,而不是德爾福一個(好像運行在這種情況下細所以我的猜測是,它是某種定時/線程/死鎖問題)
- 添加AddVectoredExceptionHandler然後我看到一個EXCEPTION_ACCESS_VIOLATION,但堆棧似乎已損壞,EIP爲1,因此無法確定它發生的位置。
在這一點上,我不知道如何進一步排除故障或找到解釋。
我測試了完全相同的代碼在兩個德爾福7和2007年(稱爲WTSOpenServerW版本),並在這兩個工作正常。結合事實,它在C++中沒有問題,我在這裏懷疑Delphi ... – Remko 2010-01-06 13:19:29
這可能是一個UnicodeString/AnsiString的問題? – 2010-01-06 15:07:21
否:顯示的代碼是該項目中唯一的代碼。 – Remko 2010-01-06 20:58:27