Аргумент типа "char *" несовместим с параметром типа " LPWSTR"



Об этом, вероятно, уже спрашивали раньше, но я, кажется, не могу найти решение:



std::string GetPath()
{
char buffer[MAX_PATH];
::GetSystemDirectory(buffer,MAX_PATH);
strcat(buffer,"\version.dll");

return std::string(buffer);
}


Возвращает сообщение об ошибке:



argument of type "char *" is incompatible with parameter of type "LPWSTR"


Так что да. У кого-нибудь есть ответ?

1182   2  
c++

2 ответов:

Вам нужно использовать версию ansi:

std::string GetPath()
{
     char buffer[MAX_PATH] = {};
     ::GetSystemDirectoryA(buffer,_countof(buffer)); // notice the A
     strcat(buffer,"\\version.dll");

     return std::string(buffer);
 }

Или использовать unicode:

std::wstring GetPath()
{
     wchar_t buffer[MAX_PATH] = {};
     ::GetSystemDirectoryW(buffer,_countof(buffer)); // notice the W, or drop the W to get it "by default"
     wcscat(buffer,L"\\version.dll");

     return std::wstring(buffer);
 }

Вместо явного вызова версий A/W вы можете удалить A/W и настроить весь проект на использование ansi/unicode. Все это приведет к изменению некоторых # определений, чтобы заменить foo на foaa/W.

Обратите внимание, что вы должны использовать _countof (), чтобы избежать неправильных размеров в зависимости от типа буферов тоже.

Если вы скомпилируете код с использованием Многобайтовой поддержки, он будет скомпилирован правильно, но при компиляции с использованием флага Unicode он выдаст ошибку, потому что в Unicode support ::GetSystemDirectoryA становится ::GetSystemDirectoryW use рассмотрите возможность использования TCHAR вместо char.TCHAR определяется таким образом, что он становится char в Многобайтовом флаге и wchar_t с флагом Unicode

TCHAR buffer[MAX_PATH];
::GetSystemDirectory(buffer,MAX_PATH);
_tcscat(buffer,_T("\\version.dll"));

Вы можете использовать typedef для string /wstring, чтобы ваш код стал независимым

#ifdef UNICODE 
typedef wstring STRING;
#else
typedef string STRING;
#endif

STRING GetPath()
{
    TCHAR buffer[MAX_PATH];
    ::GetSystemDirectory(buffer,MAX_PATH);
    _tcscat(buffer,_T("\\version.dll"));

    return STRING(buffer);
}

Comments

    Ничего не найдено.