我需要启动一个进程并可以访问PID,所以我尝试使用ShellExecuteEx。我正在尝试打开批处理文件。但是,无论我如何传递参数,无论文件位于何处以及我对文件具有哪些权限,该函数都会返回错误代码5:拒绝访问。
以下是我尝试过的一些代码:
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”;如建议。 (仍然是相同的结果)
答案 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";