当期望31(无文件关联)时,ShellExecuteEx在hInstApp中返回42

时间:2011-09-26 11:14:04

标签: delphi shellexecuteex

当在Delphi 7中使用ShellExecuteEx使用动词打开文件时,我似乎总是在hInstApp中返回42,即使我期望得到失败和31结果,因为没有文件关联。我正在从ShellExecute迁移到ShellExecuteEx,以便我可以将WaitForInputIdle与进程句柄一起使用。

当我没有安装Excel时尝试打开XLS文件时,ShellExecute按预期返回31,但ShellExecuteEx似乎成功并返回42,即使它实际上已失败并弹出默认的Windows文件关联对话框。 / p>

我做错了吗?在WinXP和Win7上使用Delphi 7。

以下示例代码。在Win XP 32位操作系统上使用Delphi 7,但在Win 7 64位上获得相同的结果。只是对hInstApp值进行showmessage返回42,因为我没有安装Excel,因此我希望得到31。

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;

3 个答案:

答案 0 :(得分:1)

ShelLExecuteEx返回值与ShelLExecute不同。请阅读此处的文档:http://msdn.microsoft.com/en-us/library/bb762154%28v=VS.85%29.aspx。还要检查是否在SHELLEXECUTEINFO中设置了正确的标志,以确定发生错误时的正确行为。

答案 1 :(得分:0)

应该使用指针作为参数调用ZeroMemory函数:

ZeroMemory(@ExecInfo, sizeof(ExecInfo));

然后我将使用Shell ExecuteEx的结果继续:

if (ShellExecuteEx(@ExecInfo)) then

据我所知,你应该最后关闭手柄:

CloseHandle(ExecInfo.hProcess);

调用动词设置为nil的函数,会告诉Windows使用标准动词,它比'open'更通用。

我让example等待应用程序结束,但您可以轻松地将WaitForSingleObject替换为WaitForInputIdle。

答案 2 :(得分:0)

Nehpets:“它显然没有成功”。 实际上,它有:它成功运行了RunDll32.Exe。

确保fMask成员包含SEE_MASK_FLAG_DDEWAIT。 如果没有。您可能会看到“打开方式”对话框。