C++ 将宽字符串与ifstream::open一起使用,或将多字节字符串与CreateProcess一起使用
我有一段代码,其中需要将字符串与ifstream::open和CreateProcess一起使用,比如C++ 将宽字符串与ifstream::open一起使用,或将多字节字符串与CreateProcess一起使用,c++,string,C++,String,我有一段代码,其中需要将字符串与ifstream::open和CreateProcess一起使用,比如 //in another file const char* FILENAME = "C:\\...blah blah\\filename.bat"; CreateProcess需要一个LPCWSTR,因此要在CreateProcess中使用该字符串,我需要将文件名和“cmdLine”声明为std::wstring,但ifstream::open不使用宽字符串…我无法找到解决此问题的方法。我
//in another file
const char* FILENAME = "C:\\...blah blah\\filename.bat";
CreateProcess需要一个LPCWSTR,因此要在CreateProcess中使用该字符串,我需要将文件名和“cmdLine”声明为std::wstring,但ifstream::open不使用宽字符串…我无法找到解决此问题的方法。我似乎总是遇到unicode与多字节字符串的问题 有什么想法吗?
谢谢。我假设您定义了
UNICODE
。您可以将STARTUPINFO
更改为STARTUPINFOA
并将CreateProcess
更改为CreateProcessA
,它应该可以正常工作(对我来说就是这样)
不过,我认为它不会喜欢+操作。显式地将一个字符数组转换为字符串
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);
然后,在
CreateProcess
中使用charCmdLine
而不是cmdLine.c_str()
您可以使用,例如,从char*
转换为wchar\u t*
。是的,定义了unicode,好的,现在我得到了错误:CreateProcessA”:无法将参数2从“const char”转换为“LPSTR”EDIT-我不确定如何正确编辑,但斜体字是我写星号的地方,它们应该是指针,但LPSTR只是char,对吗=Sconst char*是LPCSTR,这是c_str()
返回的内容。你可能需要将它复制到一个新的缓冲区,但令人惊讶的是,它没有给我一个警告或任何东西。编辑:没关系,它确实给了我一个警告>。这是因为constness的不同,它期望一个LPSTR而不是LPCSTR,我能在没有const_cast的情况下解决这个问题吗?我已经更新了我的答案。它现在编译时没有任何警告(是的,这次我肯定!)
char charCmdLine [MAX_PATH + 3]; //"/c " is 3 extra chars
strncpy (charCmdLine, cmdLine.c_str(), MAX_PATH + 3);