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

时间:2009-05-17 11:47:00

标签: 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'         指向的类型是无关的;转换需要reinterpret_cast,C风格的转换或函数式转换

问题出在哪里?

4 个答案:

答案 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,因为这最终会让你陷入混乱。