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;