WCHAR для LPCWSTR - PullRequest
       3

WCHAR для LPCWSTR

1 голос
/ 02 июля 2010

когда я использую функцию 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 ]

4 голосов
/ 02 июля 2010

Проблема не в преобразовании строки, а в ее содержимом.Вы не можете открыть том (я думаю, это то, что вы пытаетесь сделать) с помощью "G: \".Он должен быть в том же формате, который вы использовали в первом примере.Из MSDN:

При открытии тома или дисковода гибких дисков строка lpFileName должна иметь следующий вид: \\. \ X :.Не используйте обратную косую черту, которая указывает на корневой каталог диска.

Подсказка: всегда используйте GetLastError() после того, как функции API не смогут найти причину сбоя.

Обновление: Ссылка MSDN

2 голосов
/ 02 июля 2010

LPCWSTR - указатель (LP) на постоянную (C) строку широких символов (W) (STR).Другими словами, это const WCHAR*

WCHAR Drive[4]; - массив широких символов, который также можно назвать строкой широких символов.

Любой массив определенного типа может неявно преобразовыватьна указатель на тот же тип.Кроме того, указатель определенного типа может неявно преобразовываться в постоянный указатель того же типа, особенно в случае вызова функции.

Таким образом, передача Drive этой функции неявно преобразуется в LPCWSTR.

Ваша проблема не в этом преобразовании.Ваша проблема, скорее всего, заключается в содержимом ваших строк, как уже объяснял ответ Хумбагумбы.

2 голосов
/ 02 июля 2010

Вы можете использовать функцию 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...