ShellExecuteEx函数总是返回错误代码5(C ++)

时间:2014-07-15 15:00:23

标签: shellexecute shellexecuteex

我需要启动一个进程并可以访问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。

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

环境: VS 2008 Windows 7

编辑:将代码修改为“C:\ batchtest.bat”;如建议。 (仍然是相同的结果)

2 个答案:

答案 0 :(得分:2)

想出来。
为了运行批处理文件,我想在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);

我希望能帮助别人。

答案 1 :(得分:0)

不应该行

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

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