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。