13

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 で定義されたアプリケーションのすべての権利と設定を保持しているかどうかを現在調査中です。

4

6 に答える 6

2

FWIW、私たちにも同様の状況がありますが、それはセキュリティの必要性によって引き起こされており、クラッシュではありません。アプリがCitrix経由で実行されている場合、通常のウィンドウの「開く」または「名前を付けて保存」ダイアログを表示することは禁止されています。だから私たちは自分自身を転がしました。ドライブ文字(ローカルドライブのみ)、フォルダーセレクター(承認されたドライブに限定)、ファイル名セレクター、およびファイル名編集ボックスの組み合わせがあります。

私たちにとって、これはActive Directoryの問題を回避し、セキュリティを満足させます。また、ユーザーがファイルをファイルシステムにドロップしたり、表示してはいけないものを見たりするのを防ぎます。

サンドボックスで実行されていない場合は、通常のWindowsファイルダイアログが表示されます。ラッパー関数を使用すると、どこからでも呼び出すことができ、「サンドボックスとウィンドウ」の決定を1か所に残すことができます。

于 2010-07-19T20:57:24.290 に答える
2

Windows は、thumbcache.dll モジュールで AV (c0000005) を報告します。

私は、thumbcache.dll がファイルのサムネイルの作成/キャッシュに関係していると思います。サムネイルの作成は、RDP では適切に動作しない可能性がある、Explorer に対するサード パーティの拡張機能を使用することを意味する場合があります。

クリーンなシステムで試してみてください。VMWare または同様の仮想マシンを使用して、テスト構成をセットアップします。

PS この記事も参照してください:アプリケーションのハングをデバッグするには? しかし、ハングはあなたの場合の別の問題の結果に過ぎないと思います。

于 2010-07-09T09:14:23.320 に答える
0

プロセスのプロパティを表示するには、ProcessExplorerツールを使用することをお勧めします。どちらの場合も正確にどのDLLがロードされているかを確認してください(プロセスを選択し、モジュールビューで下部ペインを開くことで実行できます)。

また、プロセス監視ツールを使用して、プロセスの起動を監視し(どちらの場合も)、問題のDLLへの参照を確認することもできます。

于 2010-07-14T23:57:15.487 に答える
0

Z オーダーが正しくない場合 (適切な修正を行わなくても Citrix でよく見られます)、ctrl-F4 または alt-f4 でフォームを閉じることができます。さらに、アプリケーションは「応答なし」ではありません。タスクを切り替えると、順序が自動的に修正されることがあります

于 2016-03-04T11:34:45.087 に答える
0

問題をある種のアクセスの問題に絞り込んだようです。そのため、次の説明は役に立たないかもしれません。しかし、 RemoteAppのポップアップ ウィンドウに問題があるようで、(少なくとも理論的には) 同様の問題につながる可能性があると想像できます。 /フォーラム/en-US/winserverTS/thread/0a88919f-2d72-4340-abd7-fbe0e9545f25/

RemoteApp を使用している場合、ウィンドウの Z オーダーが常に正しいとは限りません。あなたの場合、 TOpenDialog はモーダルポップアップウィンドウでなければなりません。このバグにより、TOpenDialog がバックグラウンドで表示される可能性があると想像できました。メイン ウィンドウは前面に表示されたままになりますが、TOpenDialog がモーダルであるため無効になります。Windows は、無効なウィンドウを再描画する方法を認識せず、単に白いボックスを描画するだけです。

于 2013-04-08T14:32:31.903 に答える