WCHAR到LPCWSTR

时间:2010-07-02 09:24:03

标签: c++ windows winapi qt

当我使用如下的CreateFile函数时...它给了我有效的句柄

HANDLE hDevice = CreateFile (TEXT("\\\\.\\G:"),
                 0,FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
                 NULL, OPEN_EXISTING, 0, NULL);

if( hDevice == INVALID_HANDLE_VALUE )
{
  qDebug()<<"In valid handle";
}
else
{
  qDebug()<<"valid handle";
}

当我使用下面的内容时...它给了我无效的句柄..

WCHAR Drive[4];

qDebug ()<<QString::fromWCharArray ( Drive ); 

The above prints like "G:\"

HANDLE hDevice = CreateFile ( Drive,
                 0,FILE_SHARE_READ | FILE_SHARE_WRITE, // share mode
                 NULL, OPEN_EXISTING, 0, NULL);

if( hDevice == INVALID_HANDLE_VALUE )
{
  qDebug()<<"In valid handle";
}
else
{
  qDebug()<<"valid handle";
}

如何将wchar更改为LPCWSTR

谢谢

3 个答案:

答案 0 :(得分:4)

问题不在于字符串的转换,而在于字符串的内容。你不能用“G:\”打开一个音量(我想这就是你要做的)。它需要与第一个示例中使用的格式相同。来自MSDN:

  

打开卷或软盘驱动器时,   lpFileName字符串应该是   以下表格:\\。\ X:。不要使用   尾随反斜杠,表示   驱动器的根目录。

提示:在API函数无法获得失败原因之后,始终使用GetLastError()

更新: MSDN Link

答案 1 :(得分:2)

您可以使用toWCharArray功能或尝试以下内容:

handle = CreateFile((LPCWSTR) fileName.constData(), FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);

或者这个:

handle = CreateFile((LPCWSTR) fileName.utf16(), FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);

答案 2 :(得分:2)

LPCWSTR是指向常量(C)宽字符(W)字符串(STR)的指针(LP)。换句话说,这是const WCHAR*

WCHAR Drive[4];是一个宽字符数组,也可以称为宽字符串。

某种类型的任何数组都可以隐式转换为指向同一类型的指针。此外,某种类型的指针可以隐式转换为相同类型的常量指针,尤其是在函数调用的情况下。

因此,将Drive传递给该函数会隐式转换为LPCWSTR

你的问题不在转换中。您的问题很可能出现在字符串的内容中,因为humbagumba的答案已经解释过了。