在这方面,Windows 10 并没有什么新鲜事。您的问题实际上是关于 Unicode 与 ANSI,以及 Visual Studio 使用 Unicode 的新默认设置。
CreateProcess是一个宏,它被定义为
#ifdef UNICODE
#define CreateProcess CreateProcessW
#else
#define CreateProcess CreateProcessA
#endif // !UNICODE
另外STARTUPINFO 是STARTUPINFOA 和STARTUPINFOW 的宏
CreateProcessA 使用 ANSI 字符字符串 char* 和 STARTUPINFOA
CreateProcessW 使用 Unicode 宽字符字符串 wchar_t* 和 STARTUPINFOW
如果您坚持使用 ANSI(不推荐),请转到项目设置 -> 字符集并禁用 Unicode。
如果你坚持使用带有Unicode设置的ANSI版本(仍然不推荐),你需要
//Using ANSI when UNICODE is defined (not recommended):
STARTUPINFOA si = { sizeof(si) };
PROCESS_INFORMATION pi;
std::string path = "c:\\windows\\notepad.exe \"c:\\test\\_text.txt\"";
//if not using C++11 or later, force a zero at the end
//to make sure path is null-ternminated
path.push_back(0);
if(CreateProcessA(NULL, &path[0], NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
只要目录名称与 ANSI 兼容,上述代码就可以工作。但推荐的版本是:
//recommended:
{
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
std::wstring path = L"c:\\windows\\notepad.exe \"c:\\test\\_text.txt\"";
//if not using C++11 or later, force a zero at the end
//to make sure path is null-ternminated
path.push_back(0);
if(CreateProcess(0, &path[0], NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
}
另外,不要将常量字符串转换为字符串,如下所示:
wchar_t* arg_concat = const_cast<wchar_t*>( input.c_str() );
CreateProcess 中的第二个参数应该是wchar_t*,因为进程可能会修改命令行。