当作为远程桌面应用程序运行时,Delphi TOpenDialog在Windows 2008中挂起

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下定义的应用程序的所有权限和设置.

Ale*_*lex 2

Windows 在thumbcache.dll 模块中报告AV (c0000005)。

\n\n

我认为thumbcache.dll与构建/缓存文件缩略图有关。构建缩略图可能意味着使用资源管理器的第 3 方扩展,这可能与 RDP 表现不佳。

\n\n

在干净的系统上尝试一下。使用VMWare或类似的虚拟机来设置测试配置。

\n\n

PS 另请参阅这篇文章:如何调试 application\xe2\x80\x99s 挂起?但我认为挂起只是您案例中另一个问题的结果。

\n