не удается преобразовать аргумент 1 из wchar в lpcstr

#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);
}