C++ C++;Windows上的std::字符串转换问题

C++ C++;Windows上的std::字符串转换问题,c++,windows,string,C++,Windows,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” 指向的类型是不相关的;转换需要重新解释转换、C样式转换或函

这是我的程序:

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” 指向的类型是不相关的;转换需要重新解释转换、C样式转换或函数样式转换


问题出在哪里?

看起来您是在启用Unicode支持的情况下编译的。您可能希望将其关闭,或者如果没有,请使用std::wstring而不是std::string


正如其他人所建议的,您可以直接调用CreateFileA,但我强烈建议您不要这样做-您将得到一个无法维护的Unicode和非Unicode函数调用集合。

std::string由一个字符数组组成,因此
c_str
函数返回一个
const char*

LPCWSTR
是指向常量宽字符串的长指针,或者换句话说,
const wchar\u t*

所以你有两个选择。以宽字符串形式获取文件名(std::wstring),或者指定希望使用CreateFile的非宽版本。这可以通过调用CreateFileA或在项目设置中禁用UNICODE来实现


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

您指定了std::string,其字符类型为
char
。您在中使用的代码必须在预处理器符号
UNICODE
的定义下编译,因为这会选择实际的底层函数
CreateFileW()


要么去掉UNICODE定义,要么显式使用
CreateFileA()

问题是您试图将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,因为这最终会让您陷入混乱。

取决于您的开发平台。注意:正确的解决方案,尤其是如果这是新软件,是使用std::wstring。