0

我需要启动一个进程并可以访问 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”;按照建议。(还是一样的结果)

4

2 回答 2

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);

我希望这可以帮助其他人。

于 2014-07-17T15:10:10.830 回答
0

不应该线

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

exInfo.lpFile = "C:\\batchtest.bat";
于 2014-07-15T15:07:41.047 回答