当在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;
答案 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。 如果没有。您可能会看到“打开方式”对话框。