1
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 将失败。但如果文件路径是普通文件名,例如“记事本”,它确实有效。

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

错误代码是 ERROR_NO_ASSOCIATION。

请帮我解决这个矛盾。

4

1 回答 1

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

于 2013-05-20T10:09:55.473 回答