【问题标题】:ShellExecuteEx function always returning error code 5 (C++)ShellExecuteEx 函数总是返回错误代码 5 (C++)
【发布时间】:2014-07-15 15:00:22
【问题描述】:

我需要启动一个进程并有权访问 PID,因此我尝试使用 ShellExecuteEx。我正在尝试打开一个批处理文件。但是,无论我如何传递参数,无论文件位于何处以及我对文件有什么权限,该函数都会返回错误代码 5:访问被拒绝。

  • 该文件与已成功读取的配置文件位于同一位置。
  • 文件已设置为任何用户的完全访问权限。
  • 它适用于任何文件类型。我试过只打开具有相同结果的文本文件(错误 5)
  • 如果我改用 ShellExecute(),批处理文件运行成功。

这是我尝试过的一些代码:

SHELLEXECUTEINFO exInfo;
exInfo.cbSize = sizeof(SHELLEXECUTEINFO);
exInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
exInfo.lpVerb = "open";
exInfo.lpFile = "C:\\batchtest.bat";
exInfo.nShow = SW_NORMAL;
BOOL hReturnCode = ShellExecute(&exInfo);
DWORD LastError = GetLastError();

我也试过了:

SHELLEXECUTEINFO exInfo;
exInfo.cbSize = sizeof(SHELLEXECUTEINFO);
exInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
exInfo.lpVerb = "open";
exInfo.lpFile = "C:\\Windows\\system32\\cmd.exe";
exInfo.lpParameters = "batchtest.bat";

以及上述的许多变体。

另外,我尝试了一些非常简单的方法,例如: Get PID from ShellExecute

无济于事。

但是:

ShellExecute(NULL, "open", "C:\\testbat.bat", NULL, NULL, SW_SHOWNORMAL);

可以正常工作。不幸的是,我需要 PID,所以我不能使用 ShellExecute。

任何建议将不胜感激。我觉得我已经用尽了所有的选择。

环境: 对比 2008 视窗 7

编辑:将代码固定为“C:\batchtest.bat”;按照建议。 (还是一样的结果)

【问题讨论】:

标签: shellexecute shellexecuteex


【解决方案1】:

想通了。
为了运行批处理文件,我猜想在 Windows 7 上运行一些其他类型的 exe,你必须使用 lpVerb = _TEXT("runas") 来提升调用——即使你关闭了 UAC。这在 MDSN 上的 SHELLEXECUTEINFO 结构文档中没有记录(甚至没有作为选项给出),因为它说:“以下动词是常用的” 最终代码如下:

SHELLEXECUTEINFO exInfo;
exInfo.cbSize = sizeof(SHELLEXECUTEINFO);
exInfo.fMask = SEE_MASK_NOCLOSEPROCESS; //allows the PID to be returned
exInfo.hwnd = NULL;
exInfo.lpVerb =  _TEXT("runas"); //elevates for Windows 7
exInfo.lpFile = "C:\\BatchTest.bat";
exInfo.lpParameters = NULL;
exInfo.nShow = SW_MAXIMIZE;
exInfo.hInstApp = NULL;
exInfo.lpDirectory = NULL;
BOOL hReturnCode = ShellExecuteEx(&exInfo);

我希望这对其他人有所帮助。

【讨论】:

    【解决方案2】:

    该不该行

    exInfo.lpFile = "C:\\batchtest.exe";
    

    成为

    exInfo.lpFile = "C:\\batchtest.bat";
    

    【讨论】:

    • 很抱歉。是的,它应该。我都试过了,一定是复制了错误的代码。两者产生相同的结果——错误代码 5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2017-06-30
    • 2017-06-08
    • 1970-01-01
    • 2012-01-08
    • 2022-11-07
    相关资源
    最近更新 更多