找到cmd.exe文件的位置

时间:2016-10-12 05:09:00

标签: c++ windows shell visual-c++

我已经构建了一个依赖“cmd.exe”来执行某些任务的c ++程序。 现在我和测试目的,该文件的路径是“c:\ windows \ system32 \ cmd.exe”。 我的问题是有任何c ++ API返回该文件的路径,知道我的程序必须在win32和win64上工作。

2 个答案:

答案 0 :(得分:3)

GetSystemDirectory是一种选择。对于32位应用程序,它将返回32位系统目录。对于x64应用程序,它将返回64位本机系统目录。

你也可以CreateProcessShellExecuteExcmd.exe一起使用,除非你特别关注某人操纵搜索路径并弄错了{{1 }}

如果您要发布cmd.exe文件,那么您只需使用.cmd动词ShellExecuteEx即可。通常,对于Windows桌面应用程序,建议使用open启动其他程序。例如,这里有一些代码将启动运行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可以使用正确的manifest elements处理前提的管理员提升请求。如果目标EXE需要比当前进程更高的权限,ShellExecuteEx将失败。

答案 1 :(得分:0)

解释器路径在%COMSPEC%环境变量中可用,可以使用GetEnvironmentVariable()读取。