c ++ createprocess - 命令行参数的字符串var - 没有发生任何事情

Posted

技术标签:

【中文标题】c ++ createprocess - 命令行参数的字符串var - 没有发生任何事情【英文标题】:c++ createprocess - string var for cmd line parameter - nothing happening 【发布时间】:2017-09-23 03:07:43 【问题描述】:

所以我正在尝试使用字符串变量创建一个进程。

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
ZeroMemory(&pi, sizeof(pi));

si.cb = sizeof(si);

std::string cmd_line = game_path + " " + std::string(game_params);

std::cout << cmd_line << "\n";

if (!CreateProcess(NULL, LPTSTR(cmd_line.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) 
    std::cout << "fail\n";
    return false;

cout cmd_line 的输出是正确的路径和参数:

C:\\Program Files (x86)\\My_Game\\Game.exe -test -admin

createprocess 调用返回 false,但我不确定具体原因。我对此很陌生,所以任何帮助和建议都会很棒。

【问题讨论】:

Right from the horse's mouth: "如果函数失败,返回值为零。要获取扩展错误信息,请调用 GetLastError。"我建议首先遵循建议并获取一些扩展信息。可能是相关的。 谢谢。我在这里使用代码:msdn.microsoft.com/en-us/library/windows/desktop/… 我收到错误代码 2 - 文件不存在。我直接从地址栏等复制路径。除非我遗漏了什么,否则它肯定是正确的路径 【参考方案1】:
int _tmain(int argc, _TCHAR* argv[])

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    ZeroMemory(&pi, sizeof(pi));

    si.cb = sizeof(si);

    std::string game_path = "C:\\Windows\\system32\\calc.exe";
    std::string game_params = "-test -admin";

    std::string cmd_line = game_path + " " + std::string(game_params);

    std::cout<<cmd_line << "\n";

    TCHAR tszCmdLine[1024] = 0;
    mbstowcs(tszCmdLine, cmd_line.c_str(), 1024);
    _tprintf(tszCmdLine);

    if (!CreateProcess(NULL, tszCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) 
        std::cout<<"fail\n"<<GetLastError();
        return false;
    

const char* 不能是CreateProcess() 的参数。您必须使用mbstowcs()char* 字符串转换为tchar* 字符串

【讨论】:

非常感谢。我认为LPTSTR(cmd_line.c_str()) 正在进行所需的转换,吸取了教训。 由于代码转换为 Unicode,tszCmdLine 应声明为 WCHAR[] 而不是 TCHAR[]CreateProcess 应更改为 CreateProcessW 以匹配。我会使用std::vector 而不是固定数组。或者更好的是,将cmd_line 更改为std::wstring 并将其传递给CreateProcessW,使用&amp;cmd_line[0] 而不是cmd_line.c_str() 我认为使用MultiByteToWideChar()mbstowcs() 更好【参考方案2】:

我已经测试了你的代码。

GetLastError() 的结果是 2。

那是The system cannot find the file specified.

使用MultiByteToWideCharchar* 字符串转换为TCHAR* 字符串。

MultiByteToWideChar(LC_ALL, 0, cmd_line.c_str(), -1, str_command, MAX_PATH);

【讨论】:

以上是关于c ++ createprocess - 命令行参数的字符串var - 没有发生任何事情的主要内容,如果未能解决你的问题,请参考以下文章

CreateProcess 只执行一半命令

无法识别 C++ CreateProcess 'telnet'

CreateProcess 挂钩以添加命令行

C语言编程: CreateProcess标准输出重定向到文件

CreateProcess 命令行参数

CreateProcess 和命令行参数