1

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

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

难道我做错了什么?在 WinXP 和 Win7 上使用 Delphi 7。

下面的示例代码。在 Win XP 32 位操作系统上使用 Delphi 7,但在 Win 7 64 位上也得到相同的结果。只是在 hInstApp 值上显示消息返回 42,而我希望得到 31,因为我没有安装 Excel。

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 返回值与 ShellLExecute 不同。在此处阅读文档: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 回答
0

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

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

于 2016-03-16T15:23:06.983 回答