gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:54:38 25 4
gpt4 key购买 nike

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。

请帮我解决这个矛盾。

最佳答案

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

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

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 的成员的显式赋值。

关于c++ - 如何 shellexecute 临时安装程序文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16646844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com