我正在解决现有代码始终正常工作的问题(它是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