Windows上的C ++ std :: string转换问题

这是我的程序:

bool Open(std::string filename) { ... HANDLE hFile = CreateFile(filename.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); ... } 

错误:'CreateFileW':无法将参数1从'const char *'转换为'LPCWSTR'指向的types是不相关的; 转换需要reinterpret_cast,C风格转换或函数风格转换

哪里有问题?

一个std :: string由一个char数组组成,所以c_str函数返回一个const char*

LPCWSTR是一个指向常量宽字符串的长指针,换句话说,就是const wchar_t*

所以你有几个选择。 获取文件名作为宽字符串(std :: wstring),或者指定您想要非宽版本的CreateFile来代替。 这可以通过在您的项目设置中调用CreateFileA或禁用UNICODE来完成。

CreateFile是一个宏,可以根据是否启用unicode来解析为CreateFileA(char版本)或CreateFileW(宽字符版本)。

你已经指定了std :: string,其字符类型是char 。 而且你使用CreateFile()的代码必须在预处理器符号UNICODE的定义下编译,因为它选择了实际的底层函数CreateFileW()

要么摆脱UNICODE定义,要么明确地使用CreateFileA()

看起来你正在编译Unicode支持打开。 你可能想关闭它,或者如果不使用std :: wstring而不是std :: string。

正如其他人所建议的,你可以直接调用CreateFileA,但是我强烈建议你不要这样做 – 最终你将得到一个不可或缺的Unicode和非Unicode函数调用集合。

问题是你正试图传递char *到一个函数需要wchar_t *

你可以写一个函数把字符串转换成wstring:

 wstring Widen( const string& str ); 

然后你可以这样调用CreateFile:

 HANDLE hFile = CreateFile( Widen(filename).c_str(), etc. ); 

我见过的另一种技术是根据Unicode设置有条件地将tstring定义为string或wstring,并在代码中随处使用tstring。

 bool Open(tstring filename) { ... HANDLE hFile = CreateFile( filename.c_str(), etc. ); ... } 

这恐怕是一个棘手的问题,对你来说最好的解决办法是只有你自己才能做出决定。 但是,我同意Neil的看法,并且避免直接调用CreateFileA,因为最终会让你陷入混乱。