#c
#c
Вопрос:
Не удается перевести весь проект в Юникод.
void CreateDir(string dirname)
{
char my_dir[247];
WCHAR wcmy_dir[UNLEN 1];sprintf_s(my_dir, dirname.c_str());
MultiByteToWideChar(CP_ACP, 0, my_dir, (int)strlen(my_dir) 1, wcmy_dir,
sizeof(wcmy_dir)/sizeof(wcmy_dir[0]));
CreateDirectory(wcmy_dir, NULL);
}
Комментарии:
1. Проводили ли вы какие-либо исследования по этому вопросу?
2. Убедитесь, что набор символов для вашего проекта установлен на «Использовать набор символов Unicode», см.: godbolt.org/z/Bpy3p5
3. Текущая версия проекта, который вы используете, не является юникодом, и именно поэтому CreateDirectory расширен до CreateDirectoryA, а не CreateDirectoryW.
4. Если я изменю project на unicode, я получу примерно 10 других ошибок в проекте
5. Тогда это необходимо исправить, если вы хотите получить сборку в Юникоде.
Ответ №1:
Ваш проект не настроен на использование Unicode, поэтому CreateDirectory()
будет отображаться на CreateDirectoryA()
вместо CreateDirectoryW()
, как предполагается в вашем коде. Передача WCHAR
строки в CreateDirectoryA()
действительно является ошибкой.
Поскольку вы на самом деле не вызываете CreateDirectoryW()
, вам вообще не нужно вызывать MultiByteToWideChar()
. Просто вызывайте CreateDirectoryA()
явно, передавая ему свой ввод string
как есть:
void CreateDir(string dirname)
{
CreateDirectoryA(dirname.c_str(), NULL);
}
Внутренне он преобразует char
данные в WCHAR
с помощью CP_ACP
, а затем вызывает CreateDirectoryW()
для вас.
Если вы когда-нибудь решите обновить свой проект для использования Unicode, но не измените свою функцию на use wstring
, этот же код все равно будет работать без изменений.
Если вы когда-нибудь решите изменить свою функцию на использование wstring
вместо этого, просто вызовите CreateDirectoryW()
явно, чтобы соответствовать:
void CreateDir(wstring dirname)
{
CreateDirectoryW(dirname.c_str(), NULL);
}