2 番目の exe を起動する Delphi 2010 exe があります。2 番目の exe には、openDialog.execute を呼び出すダイアログがあります。これをリモート デスクトップの Windows 2008 Enterprise R2 で実行すると、期待どおりに実行されますが、リモート アプリケーションとして実行すると、ファイル ダイアログがポップアップするとすぐにアプリケーションがハングし、すべてのアプリケーション ウィンドウが白くなります。それから抜け出す唯一の方法は、アプリケーションを終了することです。TOpenDialog を TFileOpenDialog に置き換えてみましたが、結果は同じです。メイン アプリケーションを起動する RDP ファイルの変更を検討しましたが、違いを生むパラメータが見当たりません。誰もこの種の行動を見たことがありますか?
2010.07.13 更新
これは、簡単な例を使用して再現できます。この例には 2 つの実行可能ファイルがあります。1 つ目は m_module.exe と呼ばれるファイル ランチャーで、1 つの編集、1 つのボタン、および以下のコードが含まれています。起動ボタンをクリックする前に、編集で実行可能ファイルの名前を 2 番目の実行可能ファイルと一致するように変更します。
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;
2 番目の実行可能ファイルには、ボタンと以下のコードが含まれています。
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDialog1.execute;
end;
最初のモジュールは、RDP ファイルから起動されます。
2010.07.14 更新
次のdllをコピーすると、次のことがわかりました。
thumbcache.dll
dtsh.dll
wkscli.dll
\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 の 1 つが、サンドボックス化されたディレクトリではなく、実際のシステム ディレクトリ内の実際の 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 をアプリケーションの USES セクションに追加し、USES セクションのすぐ下に追加することで、アプリケーションの PE ヘッダーに追加できます。
{$SetPEOptFlags IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE}
これにより、アプリケーションは互換性レイヤーをバイパスします。生成されたプロセス (例: 2 番目の exe) が、RDS で定義されたアプリケーションのすべての権利と設定を保持しているかどうかを現在調査中です。