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。
请帮我解决这个矛盾。
答案 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
的成员的显式赋值。