-->

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

2019-10-20 10:59发布

我需要启动一个进程,并有机会获得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";

上述的和许多变化。

另外,我试过很简单的东西喜欢从这里: 从ShellExecute的获取PID

无济于事。

然而这样的:

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

工作没有错误。 不幸的是,我需要的PID,所以我不能使用的ShellExecute。

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

环境:VS 2008米的Windows 7

编辑 :固定的代码“C:\ batchtest.bat”; 的建议。 (静止相同的结果)

Answer 1:

弄清楚了。
为了运行批处理文件,我想一些其他类型的exe的在Windows 7上,必须提高使用lpVerb = _TEXT(“运行方式”)的调用 - 即使你有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);

我希望帮助别人了。



Answer 2:

应该不是线

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

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


文章来源: ShellExecuteEx function always returning error code 5 (C++)