[英]find the location of the cmd.exe file
我已经构建了一个依赖“cmd.exe”来执行某些任务的c ++程序。 现在我和测试目的,该文件的路径是“c:\\ windows \\ system32 \\ cmd.exe”。 我的问题是有任何c ++ API返回该文件的路径,知道我的程序必须在win32和win64上工作。
GetSystemDirectory
是一个选项。 对于32位应用程序,它将返回32位系统目录。 对于x64应用程序,它将返回64位本机系统目录。
您也可以将CreateProcess
或ShellExecuteEx
与cmd.exe
,它应该在没有路径的情况下找到它,除非您特别关注某人操纵搜索路径并获取错误的cmd.exe
。
如果要启动.cmd
文件,则可以使用带有open
动词的ShellExecuteEx
执行此操作。 通常,对于Windows桌面应用程序,建议使用ShellExecuteEx
来启动其他程序。 例如,这里有一些代码将启动运行test.cmd
脚本的命令提示符并等待结果:
#include <windows.h>
#include <stdio.h>
#pragma comment(lib,"shell32.lib")
void main()
{
SHELLEXECUTEINFOW info = {};
info.cbSize = sizeof( info );
info.lpVerb = L"open";
info.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOASYNC | SEE_MASK_NOCLOSEPROCESS;
info.lpFile = L"test.cmd";
info.lpParameters = nullptr; // Command-line parameters
info.lpDirectory = nullptr; // Working directory to set
info.nShow = SW_SHOW;
if( !ShellExecuteExW( &info ) )
{
printf("ERROR\n");
}
else
{
// Wait for process to finish.
WaitForSingleObject( info.hProcess, INFINITE );
// Return exit code from process
DWORD exitcode;
GetExitCodeProcess( info.hProcess, &exitcode );
CloseHandle( info.hProcess );
printf("Finished with exit code %u\n", exitcode);
}
}
您还可以使用:
info.lpFile = L"cmd.exe";
info.lpParameters = L"/c test.cmd";
使用
ShellExecuteEx
而不是CreateProcess
主要原因是ShellExecuteEx
可以使用正确的清单元素处理exes的管理员提升请求。 如果目标EXE需要比当前进程更高的权限,CreateProcess
将失败。
解释器路径在%COMSPEC%
环境变量中可用,可以使用GetEnvironmentVariable()
读取。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.