在CreateProcess中使用ifstream :: open或multibyte字符串的宽字符串

时间:2012-04-19 11:53:55

标签: c++ string

我有一段代码,我需要在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字符串的问题。

有什么想法吗? 感谢。

1 个答案:

答案 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}}。