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
,使用&cmd_line[0]
而不是cmd_line.c_str()
。
我认为使用MultiByteToWideChar()
比mbstowcs()
更好【参考方案2】:
我已经测试了你的代码。
GetLastError()
的结果是 2。
那是The system cannot find the file specified.
使用MultiByteToWideChar
将char*
字符串转换为TCHAR*
字符串。
MultiByteToWideChar(LC_ALL, 0, cmd_line.c_str(), -1, str_command, MAX_PATH);
【讨论】:
以上是关于c ++ createprocess - 命令行参数的字符串var - 没有发生任何事情的主要内容,如果未能解决你的问题,请参考以下文章
无法识别 C++ CreateProcess 'telnet'