Каков ожидаемый тип ввода FindFirstFile?

Начну с того, что я ничего не знаю о широких строках и поддержке Unicode. Я позволяю QString и QFile обрабатывать это для меня 99% времени, но я пытаюсь скомпилировать чужую библиотеку, написанную для VC6.

Когда я компилирую с MSVC2010 в Qt Creator, я получаю эту ошибку:

error: C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Код использует FindFirstFile функция, которая перегружена (в некотором роде) в зависимости от того, компилируете ли вы с набором символов Unicode. Я не понимаю какой тип FindFirstFile ожидается, когда входные данные для FindFirstFileA и FindFirstFileW представляются двумя совершенно разными типами.

Итак, вот мой вопрос: каков ожидаемый тип ввода для FindFirstFile?

Следствие: как мне взять имя файла типа const char* и положить его в форму, которую примет FindFirstType?

2 ответа

Решение

FindFirstFile - это макрос, определяемый следующим образом:

#ifdef UNICODE
#define FindFirstFile  FindFirstFileW
#else
#define FindFirstFile  FindFirstFileA
#endif // !UNICODE

Это означает, что он расширяется до W при компиляции с UNICODE определяется, и он расширяется до того, с A иначе.

Сейчас, FindFirstFileПервый параметр либо LPCSTR или же LPWCSTR, LPCSTR является typedef для const char* в то время как LPWCSTR является typedef для const wchar_t*, В сообщении об ошибке вы пытаетесь передать тип const char* в качестве первого аргумента FindFirstFileW который принимает аргумент типа const wchar_t*отсюда и ошибка.

Для того, чтобы типы соответствовали, вам нужно передать объект типа const wchar_t*У вас есть несколько вариантов:

std::wstring path1 = L"..."; // 1
const wchar_t* path2 = L"..."; // 2
wchar_t path3[] = L"..."; // 3

WIN32_FIND_DATA  w32fd;
FindFirstFile(path1.c_str(), &w32fd); // 1
FindFirstFile(path2, &w32fd); // 2
FindFirstFile(path3, &w32fd); // 3
FindFirstFile(L"...", &w32fd);

Как взять имя файла типа const char* и поместить его в форму, которую примет FindFirstType?

Если ваше имя файла содержит только символы в базовом наборе символов ASCII, вы можете преобразовать его в std::wstring как следующее: std::wstring path(std::begin(filename), std::end(filename));, В противном случае вам нужно будет использовать MultiByteToWideChar или многие параметры, показанные здесь. Другим вариантом будет позвонить FindFirstFileA напрямую, но если вы находитесь на Windows, как правило, было бы лучше использовать wchar_t начать с.

Ожидаемый тип ввода - const wchar_t*, если вы компилируете для Unicode. (Что вы есть: "W" говорит нам об этом.). Ожидаемый тип ввода - const char *, если вы не компилируете для Unicode. Прежде чем решить вашу проблему, вы должны решить, компилировать ли для Unicode или нет. Если вы выберете Unicode, тогда ваши строки должны быть wchar_t * или std::wstring или CString. Это должно заставить вашу проблему уйти.

Если вам действительно нужно использовать const char * в приложении, скомпилированном в юникоде, тогда вам нужно преобразовать const char * в строку const wchar_t*, вызвав функцию API MultiByteToWideChar.

Другие вопросы по тегам