我有一段代码,我需要在ifstream :: open和CreateProcess中使用字符串,类似
//in another file
const char* FILENAME = "C:\\...blah blah\\filename.bat";
// in main app
std::ifstream is;
is.open(FILENAME);
// ...do some writing
is.close();
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
std::string cmdLine = "/c " + FILENAME;
if( !CreateProcess( "c:\\Windows\\system32\\cmd.exe",
cmdLine.c_str(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) )
{
return GetLastError();
}
CreateProcess需要一个LPCWSTR,所以要使用带有CreateProcess的字符串,我需要将文件名和'cmdLine'声明为std :: wstring,但ifstream :: open不需要宽字符串...我不能找到解决这个问题的方法。我似乎总是遇到unicode vs multibyte字符串的问题。
有什么想法吗? 感谢。
答案 0 :(得分:1)
我假设你定义了UNICODE
。您可以将STARTUPINFO
更改为STARTUPINFOA
,将CreateProcess
更改为CreateProcessA
,它应该可以正常工作(它适用于我)。
我不认为它会像+操作那样。将一个char数组显式转换为字符串。
std::string cmdLine = (std::string)"/c " + FILENAME;
最后,如果FILENAME
有空格,你需要在const char FILENAME = "\"C:\\Program Files\\Company\\Program\\program.exe\"";
^ ^ ^
的开头和结尾附近引用。
char charCmdLine [MAX_PATH + 3]; //"/c " is 3 extra chars
strncpy (charCmdLine, cmdLine.c_str(), MAX_PATH + 3);
编辑: 尝试将其放在字符串声明下面:
charCmdLine
然后,使用CreateProcess
中的cmdLine.c_str()
代替{{1}}。