Bil*_*ven 12 windows delphi rda
我有一个Delphi 2010 exe,它启动了第二个exe.在第二个exe中,有一个调用openDialog.execute的对话框.当它在远程桌面下的Windows 2008 Enterprise R2下运行时,它会按预期运行,但是当作为远程应用程序运行时,只要弹出文件对话框,应用程序就会挂起,将所有应用程序窗口都变为白色.摆脱它的唯一方法是终止应用程序.我尝试用TFileOpenDialog替换TOpenDialog,结果是一样的.我已经考虑修改启动主应用程序的RDP文件,但是看不到任何会产生影响的参数.以前有没有人见过这种行为?
2010.07.13更新
这可以使用一个简单的例子重现.示例中有两个可执行文件.第一个是文件启动器,名为m_module.exe,它包含一个编辑,一个按钮和下面的代码.在单击启动按钮之前,我在编辑中更改可执行文件的名称以匹配第二个可执行文件:
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', stringToOLEstr(edit1.text) , nil, nil, SW_SHOWNORMAL) ;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
edit1.text:=application.exename;
end;
Run Code Online (Sandbox Code Playgroud)
第二个可执行文件包含一个按钮,代码如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.execute;
end;
Run Code Online (Sandbox Code Playgroud)
第一个模块是从RDP文件启动的.
2010.07.14更新
我发现如果我复制以下dll:
thumbcache.dll
dtsh.dll
wkscli.dll
Run Code Online (Sandbox Code Playgroud)
从\ Windows\System32文件夹进入应用程序文件夹,问题就消除了.
我进一步发现将\ Windows\System32文件夹中这些dll的所有权和权限级别从TrustedInstaller更改为管理员组具有相同的结果(将它们复制到应用程序目录正在改变我认为的所有权和权限)
为了确认这一点,我确认如果我将所有权和权限级别更改回远离管理员组的TrustedInstaller,则会再次出现错误.
所以看来这是某种访问问题.也许这有助于发现问题的原因.
2010.07.18更新
一些可能有用的其他信息(由Embarcadero提供):
这篇关于GetWindowsDirectory的MSDN文章http://msdn.microsoft.com/en-us/library/ms724454%28VS.85%29.aspx记录了在终端服务下运行的应用程序的一些有趣行为.虽然没有直接调用GetWindowsDirectory,但每个用户的Windows系统目录的沙盒可能会导致某种问题.也许GetOpenFileNameA的调用链中的一个DLL试图引用真实系统目录中的真实DLL而不是沙盒,从而导致权限违规.这只是猜测,但值得研究.如果您能够在服务器上运行SysInternals Process Monitor或Process Explorer,您应该能够看到commdlg32和堆栈跟踪中的其他DLL被加载.
所有旧应用程序(即,未为终端服务或远程桌面服务创建的所有应用程序)都在应用程序兼容性层下运行.请参阅此MSDN文章http://msdn.microsoft.com/en-us/library/cc834995%28VS.85%29.aspx.IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE标志在Windows.PAS中定义.出于测试目的,您可以将Windows添加到应用程序的PE头部,方法是将Windows添加到应用程序的USES部分,并在USES部分下面添加:
{$ SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}
这将导致您的应用程序绕过兼容层.我目前正在调查产生的进程(例如你的第二个exe)是否保留了在RDS下定义的应用程序的所有权限和设置.
Windows 在thumbcache.dll 模块中报告AV (c0000005)。
\n\n我认为thumbcache.dll与构建/缓存文件缩略图有关。构建缩略图可能意味着使用资源管理器的第 3 方扩展,这可能与 RDP 表现不佳。
\n\n在干净的系统上尝试一下。使用VMWare或类似的虚拟机来设置测试配置。
\n\nPS 另请参阅这篇文章:如何调试 application\xe2\x80\x99s 挂起?但我认为挂起只是您案例中另一个问题的结果。
\n