Каков ожидаемый тип ввода 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.