1

Delphi 7 で ShellExecuteEx を使用して動詞を使用してファイルを開くと、ファイルの関連付けがないため、失敗と 31 の結果が返されると予想していても、hInstApp の結果として常に 42 が返されるようです。プロセス ハンドルで WaitForInputIdle を使用できるように、ShellExecute から ShellExecuteEx に移行しています。

Excel がインストールされていないときに XLS ファイルを開こうとすると、ShellExecute は期待どおりに 31 を返しますが、ShellExecuteEx は実際には失敗してデフォルトの Windows ファイル関連付けダイアログをポップアップしたにもかかわらず、成功して 42 を返すように見えます。

私は何か間違ったことをしていますか?WinXP および Win7 で Delphi 7 を使用する。

以下サンプルコード。Win XP 32 ビット OS で Delphi 7 を使用していますが、Win 7 64 ビットでも同じ結果が得られます。Excel がインストールされていないため、hInstApp 値に対して showmessage を実行すると、31 が返されると予想されるときに 42 が返されます。

var
  ExecInfo: TShellExecuteInfo;
begin
  ZeroMemory(ExecInfo, sizeof(ExecInfo));
  with ExecInfo do
  begin
    cbSize := sizeOf(ExecInfo);
    fMask  := SEE_MASK_NOCLOSEPROCESS;
    lpVerb := PChar('open');
    lpFile := PChar('c:\windows\temp\test.xls');
    nShow  := 1;
  end;
  ShellExecuteEx(@ExecInfo);
  if ExecInfo.hInstApp<32
  then WaitForInputIdle(ExecInfo.hProcess, 10000);
end;
4

3 に答える 3

1

ShellLExecuteEx の戻り値は、ShelLExecute と同じではありません。次のドキュメントを参照してください: http://msdn.microsoft.com/en-us/library/bb762154%28v=VS.85%29.aspx。また、エラーが発生したときの適切な動作のために、SHELLEXECUTEINFO に適切なフラグが設定されていることを確認してください。

于 2011-09-26T12:37:02.297 に答える
0

関数 ZeroMemory は、パラメーターとしてポインターを使用して呼び出す必要があります。

ZeroMemory(@ExecInfo, sizeof(ExecInfo));

次に、Shell ExecuteEx の結果を使用して続行します。

if (ShellExecuteEx(@ExecInfo)) then

私の知る限り、最後にハンドルを閉じる必要があります。

CloseHandle(ExecInfo.hProcess);

動詞を nil に設定して関数を呼び出すと、標準の動詞を使用するように Windows に指示されます。これは、'open' よりも少し汎用的です。

アプリケーションの終了を待つ例を作成しましたが、WaitForSingleObject を WaitForInputIdle に簡単に置き換えることができます。

于 2011-09-26T15:13:13.820 に答える