C++ 将宽字符串与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不使用宽字符串…我无法找到解决此问题的方法。我

我有一段代码,其中需要将字符串与ifstream::open和CreateProcess一起使用,比如

//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);