C ++ std :: string проблема преобразования в Windows - PullRequest
2 голосов
/ 17 мая 2009

Это моя процедура:

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 ]

13 голосов
/ 17 мая 2009

std :: string состоит из массива символов, поэтому функция c_str возвращает const char*.

A LPCWSTR - это длинный указатель на постоянную широкую строку или, другими словами, const wchar_t*.

Итак, у вас есть несколько вариантов. Либо получите имя файла в виде широкой строки (std :: wstring), либо укажите, что вы хотите использовать неширокую версию CreateFile. Это можно сделать, вызвав CreateFileA или отключив UNICODE в настройках вашего проекта.

CreateFile - это макрос, который разрешается либо в CreateFileA (версия char), либо в CreateFileW (версия char) в зависимости от того, включен ли юникод.

2 голосов
/ 17 мая 2009

Вы указали std :: string, тип символа которой char. И код, который вы используете CreateFile() in, должен быть скомпилирован в соответствии с определением символа препроцессора UNICODE, так как это выбирает фактическую базовую функцию CreateFileW().

Либо избавьтесь от определения UNICODE, либо явно используйте CreateFileA().

1 голос
/ 17 мая 2009

Похоже, вы компилируете с включенной поддержкой Unicode. Вы можете отключить его или, если не используете std :: wstring вместо std :: string.

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

0 голосов
/ 17 мая 2009

Проблема в том, что вы пытаетесь передать char * в функцию, требующую wchar_t *

Вы можете написать функцию для преобразования строки в wstring:

wstring Widen( const string& str );

Тогда вы можете вызвать CreateFile следующим образом:

HANDLE hFile = CreateFile( Widen(filename).c_str(), etc. );

Еще одна техника, которую я видел, - это условно определить tstring как строку или wstring в зависимости от настройки Unicode и использовать tstring везде в вашем коде.

bool Open(tstring filename)
{
    ...
    HANDLE hFile = CreateFile( filename.c_str(), etc. );
    ...
}

Боюсь, это сложная проблема, и лучшее решение для вас - это то, что вы можете решить только вы. Тем не менее, я согласен с Нилом и держусь подальше от прямого вызова CreateFileA, так как это в конечном итоге оставит вас в беспорядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...