如何shellexecute临时安装程序文件?

时间:2013-05-20 09:52:16

标签: c++ winapi shellexecute

SHELLEXECUTEINFO shExecInfo;

shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);

shExecInfo.fMask = NULL;
shExecInfo.hwnd = NULL;
shExecInfo.lpVerb = _T("runas");
shExecInfo.lpFile = filePath;
shExecInfo.lpParameters = NULL;
shExecInfo.lpDirectory = NULL;
shExecInfo.nShow = SW_MAXIMIZE;
shExecInfo.hInstApp = NULL;

ShellExecuteEx(&shExecInfo);

如果文件路径是从Internet下载的临时文件,则ShellExecuteEx将失败。但是如果filepath是普通文件名,例如“notepad”,它确实有效。

我得出结论,shellexecute需要正确的扩展名,但普通权限应用程序无法将可执行文件写入系统分区,例如c:\ users \ xxx \ local \ temp \ xxx.exe。

错误代码为ERROR_NO_ASSOCIATION。

请帮我解决这个矛盾。

1 个答案:

答案 0 :(得分:1)

系统返回给您的错误是ERROR_NO_ASSOCIATION。虽然您尚未说明filePath的扩展名,但似乎不是.exe

如果您要将下载的文件重命名为扩展名.exe,则对ShellExecuteEx的调用将成功。这是做这件事的黑客方式。更简洁的方法是使用lpClass结构的SHELLEXECUTEINFO成员指定您希望将文件视为可执行文件。您可以通过在代码中添加以下内容来实现:

shExecInfo.fMask = SEE_MASK_CLASSNAME;
shExecInfo.lpClass = _T("exefile");

我会像这样编写你的代码:

SHELLEXECUTEINFO shExecInfo = {0};
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shExecInfo.fMask = SEE_MASK_CLASSNAME;
shExecInfo.lpVerb = _T("runas");
shExecInfo.lpFile = filePath;
shExecInfo.nShow = SW_MAXIMIZE;
shExecInfo.lpClass = _T("exefile");
ShellExecuteEx(&shExecInfo);

注意零初始化,以便我们可以省略应该是NULL的成员的显式赋值。