当我使用如下的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
谢谢
答案 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的答案已经解释过了。