这是我的程序:
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' 指向的类型是无关的;转换需要reinterpret_cast,C风格的转换或函数式转换
问题出在哪里?
答案 0 :(得分:13)
std :: string由一个char数组组成,因此c_str
函数返回const char*
。
LPCWSTR
是指向常量宽字符串的长指针,换句话说,const wchar_t*
。
所以你有几个选择。要么将文件名作为宽字符串(std :: wstring)获取,要么指定您想要非宽版本的CreateFile。这可以通过调用CreateFileA或在项目设置中禁用UNICODE来完成。
CreateFile是一个宏,它可以解析为CreateFileA(char版本)或CreateFileW(宽char版本),具体取决于是否启用了unicode。
答案 1 :(得分:2)
您指定了std :: string,其字符类型为char
。您使用CreateFile()
的代码必须在预处理器符号UNICODE
的定义下编译,因为它会选择实际的基础函数CreateFileW()
。
要么摆脱UNICODE
定义,要么明确使用CreateFileA()
。
答案 2 :(得分:1)
看起来您正在编译启用了Unicode支持。您可能想要将其关闭,或者如果不使用std :: wstring而不是std :: string。
正如其他人所建议的那样,你可以直接调用CreateFileA,但我强烈建议你不要这样做 - 你最终会得到一个不可思议的Unicode和非Unicode函数调用集合。
答案 3 :(得分:0)
问题是你试图将char *传递给需要wchar_t *
的函数您可以编写一个函数将字符串转换为wstring:
wstring Widen( const string& str );
然后你可以像这样调用CreateFile:
HANDLE hFile = CreateFile( Widen(filename).c_str(), etc. );
我见过的另一种技术是根据Unicode设置有条件地将tstring定义为字符串或wstring,并在代码中的任何地方使用tstring。
bool Open(tstring filename)
{
...
HANDLE hFile = CreateFile( filename.c_str(), etc. );
...
}
我担心这是一个棘手的问题,而对你来说最好的解决方案只有你能决定。但是,我同意Neil并避免直接调用CreateFileA,因为这最终会让你陷入混乱。