2013-12-01 3 views
-1

Ошибка я получаю:C2664 ошибка, C++, которая чужда мне

"DWORD GetModuleFileNameW(HMODULE,LPWSTR,DWORD)' : cannot convert parameter 2 from 'char *' to 'LPWSTR"

На этой линии

GetModuleFileName(NULL, &strL[0], MAX_PATH); 

Этот код

BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved) 
{ 
    switch (fdwReason) 
    { 
    case DLL_PROCESS_ATTACH: 
     { 
      std::string strL; 
      strL.resize(MAX_PATH); 
      GetModuleFileName(NULL, &strL[0], MAX_PATH); 

      DisableThreadLibraryCalls(hModule); 

      if(strL.find("notepad.exe") != std::string::npos) 
      { 
       gl_hThisInstance = hModule; 

       LoadOriginalDll(); 
      } 

      break; 
     } 
    case DLL_PROCESS_DETACH: 
     { 
      ExitInstance(); 

      break; 
     } 
    } 
    return TRUE; 
} 
+0

Нам нужно больше вашего кода. В частности, определение 'strL' (хотя мы * знаем, что это такое, потому что сообщение об ошибке описывает его достаточно подробно). – usr2564301

+1

и используйте правильное форматирование. неформатированный код затрудняет чтение –

+0

'typedef wchar_t * LPWSTR, * PWSTR; ' – texasbruce

ответ

3

От MSDN,

typedef wchar_t* LPWSTR, *PWSTR; 

Таким образом, ожидается wchar_t * (wchar_t составляет 2 байта или более), но &std::string[0] - это char* (char - это байт). Вы должны использовать std::wstring вместо:

std::wstring strL; 
0

Если вы хотите, чтобы ваш код для компиляции без использования широких строк, см здесь:

How do I turn off Unicode in a VC++ project?

Скорее всего, если Unicode включен в VC++, есть определяет так:

#ifdef UNICODE 
#define CreateFile CreateFileW 
#else 
#define CreateFile CreateFileA 
#endif // !UNICODE 

Fix:

Вы пробовали: Свойства проекта - Общие - По умолчанию проекта - Набор символов?

См ответов на этом вопросе различий между "Использовать Multi-Byte Character Set" и "Не указан" варианта: О опции "Character набора" в Visual Studio 2010

И от ссылка внутри цитаты:

это параметр совместимости, предназначенное для унаследованного кода, который был написан для старых версий Windows, которые не были включены Unicode. Версии в семействе Windows 9x, Windows ME был последним. Если выбрано «Не задано» или «Использовать набор символов нескольких байтов», все функции Windows API , которые принимают строку в качестве аргумента, переопределяются до некоторой вспомогательной функции совместимости , которая переводит строки char * в строки wchar_t *, Собственный тип строки API.

+0

Я удалил полный bool, потому что он противоречит проекту>.

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