2012-03-17 3 views
4

, когда я попытался скомпилировать мой проект, я получил некоторые ошибки, которые я не могу решить .. в любом случае это один из кодов:Visual C++: ошибка C2664: «GetModuleFileNameW»: невозможно преобразовать параметр 2 из «char [260]» в «LPWCH»

public: 
void Init(HMODULE hModule, string Filename) 
{ 
    char szLoc[ MAX_PATH ]; 
    GetModuleFileName(hModule, szLoc, sizeof(szLoc)); 
    char* dwLetterAddress = strrchr(szLoc, '\\'); 
    *(dwLetterAddress + 1) = 0; 
    strcat(szLoc, Filename.c_str()); 
    __OutStream.open(szLoc, ios::app); 
} 

И ошибка:

error C2664: 'GetModuleFileNameW' : cannot convert parameter 2 from 'char [260]' to 'LPWCH' 
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 

Спасибо за помощь .. с уважением, мессир

+0

Ваш код не вызывает 'GetModuleFileNameW'. Вы упустили что-то важное? –

+2

Ваш код компилируется как unicode, но это не так. Либо измените параметры компиляции, измените эту функцию, чтобы использовать широкие символы, либо, в частности, вызовите ASCII-версию функции - 'GetModuleFileNameA'. –

+0

Я не совсем уверен, но ваш персонаж, установленный в Visual Studio, может быть настроен на «Использовать набор символов Unicode» в разделе «Свойства конфигурации»> «Общие» свойств вашего проекта. – Bart

ответ

5

много "функций" в Windows API, на самом деле макросов к ANSI (A) или Unicode (W для широкой) версии функции. В зависимости от настроек вашего проекта эти макросы будут либо DoSomeFunctionA, либо DoSomeFunctionW, если вы хотите позвонить DoSomeFunction. Портативный способ будет тогда использовать TCHAR, потому что он определен как char для ANSI и wchar_t для Unicode.

Если вы не хотите компилировать в Юникоде, вы можете изменить настройки своего проекта на Project Properties -> Configuration Properties -> General -> Character Set -> Use Multibyte Character Set.

Если вы хотите скомпилировать с помощью Unicode, вам следует добавить A (например: GetModuleFileNameA) в нужные имена функций.

+2

Не должно быть наоборот? – BlackBear

+1

@BlackBear Для последней части? Нет. Если вы компилируете с помощью Unicode, вам нужно явно вызвать функцию ANSI. – Marlon

Смежные вопросы