«CreateDirectoryW»: невозможно преобразовать параметр 1 из «const char *» в «LPCWSTR» в OpenCV 2.4.5 и VS 2010

Я пробовал пример кода bagofwords_classification.cpp из openCV 2.4.5 в Visual Studio 2010 (на основе VC ++). Но я нашел код ошибки:

error C2664: 'CreateDirectoryW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR'

Можете ли вы помочь мне решить эту проблему? Благодарю. 🙂

Обновление v1:

static void makeDir( const string& dir )
{
#if defined WIN32 || defined _WIN32
CreateDirectory( dir.c_str(), 0 );
#else
mkdir( dir.c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH );
#endif
}

static void makeUsedDirs( const string& rootPath )
{
makeDir(rootPath + bowImageDescriptorsDir);
makeDir(rootPath + svmsDir);
makeDir(rootPath + plotsDir);
}

4

Решение

У вас есть код, который вызывает CreateDirectory, когда UNICODE определяется, что символ на самом деле является макросом для CreateDirectoryW; цель состоит в том, чтобы вы использовали «неоднозначные» имена функций, когда вы также используете TCHAR вместо char или же wchar_t, так что вы можете переключаться между компиляцией для программ Unicode или Ansi.

Тем не мение, std::string не меняется в соответствии с UNICODE; его всегда Анси, так что его c_str метод всегда возвращает char*, никогда wchar_t*, Когда у вас есть параметр, который всегда является Ansi, вы должны явно вызывать функции, которые также всегда являются Ansi. В этом случае позвоните CreateDirectoryA,

Вы также можете рассмотреть возможность использования std::basic_string<TCHAR>, но это, вероятно, движется в направлении, которое вы не хотите идти.

Быстрое решение проблемы — настроить параметры проекта так, чтобы UNICODE больше не определяется. Обратитесь к документации по вашему набору инструментов, чтобы узнать, как это сделать, или изучите варианты проекта вашей IDE.

5

Другие решения

CreateDirectory будет определяться как CreateDirectoryW который ожидает, что его параметры будут «широкими» строками (в кодировке UTF-16 WCHAR*).

Для создания широкой строки вы можете добавить L в обычную строку.

CreateDirectory(L"mydir", NULL);

В качестве альтернативы вы можете переключить свой проект на многобайтовую кодировку в свойствах. Это будет означать, что вызов CreateDirectory будет автоматически использовать CreateDirectoryA версия функции, которая принимает char* строки. Ожидается, что они будут в многобайтовой кодировке активной кодовой страницы.

5

CreateDirectoryW принимает широкий символ, если вы используете режим Юникод, это нормально. Вы, вероятно, должны использовать CreateDirectory или CreateDirectoryA.

3
По вопросам рекламы [email protected]