Как передать char* в функцию GetModuleHandle?

Я просто пытаюсь получить информацию о модуле на основе строки, которая вполне может быть чем-то вроде «somefile.exe».

MODULEINFO GetModuleInfo(char *szModule)
{
    MODULEINFO modinfo = {0};
    HMODULE hModule = GetModuleHandle(szModule);
    if(hModule == 0) 
       return modinfo;
    GetModuleInformation(GetCurrentProcess(), hModule, &modinfo, sizeof(MODULEINFO));
    return modinfo;
}

В GetModuleHandle появляется ошибка аргумент типа "char *" несовместим с параметром типа "LPCWSTR".

Теперь я пробовал множество шагов, таких как:

  1. Перейдите в «Свойства проекта» → «Свойства конфигурации» → «Набор символов» и установите для него значение Использовать многобайтовый набор символов, а не Unicode. Я видел, как это помогало другим людям, но мне это не помогло.

  2. Приведение szModule к типу (LPCWSTR)szModule. Это сделало сборку программы успешной, однако она не работала должным образом.

  3. Используя юникод, заменив параметр статическим L"somefile.exe". Это работало отлично, однако, само собой разумеется, это не очень практично.

Мой вопрос: как я могу скомпилировать GetModuleHandle(szModule), если szModule имеет тип char*?

Я использую Visual Studio 2015, если это что-то помогает.


person Per Andreasen    schedule 25.09.2015    source источник
comment
Вам нужно будет разыграть его, как во втором примере. Это работает, если szModule вместо const char*? Не похоже, что GetModuleInfo нужно модифицировать szModule, поэтому он должен быть безопасным, как const char*.   -  person Tas    schedule 25.09.2015
comment
Почему использование Unicode не очень практично? Это предпочтительный способ работы в Win32. Если вы настаиваете на использовании строк char* в своей кодовой базе, вам придется использовать функции преобразования, такие как WideCharToMultiByte/MultiByteToWideChar.   -  person gigaplex    schedule 25.09.2015
comment
@gigaplex Я не хотел сказать, что использовать юникод нецелесообразно. Я хотел сказать, что было бы непрактично иметь там статическую строку. Что меня больше всего беспокоит, так это то, почему установка набора символов проекта на Использовать многобайтовый набор символов не сработала для меня, но сработала для многих других людей, которые использовали Visual Studio 2012 и более ранние версии. Я хочу сделать это, чтобы мне не приходилось писать WideCharToMultiByte каждый раз, когда мне нужно передать LPCWSTR.   -  person Per Andreasen    schedule 25.09.2015
comment
Если у вас есть доступ к MFC или ATL, вы можете просто использовать некоторые классы-оболочки, такие как CString или CComBSTR, чтобы избежать необходимости преобразования вручную. В противном случае вы можете написать свой собственный эквивалентный класс. Что касается того, почему у вас не сработало переключение на многобайтность в настройках проекта, похоже, что-то не так с UNICODE #define. Проверьте свои заголовки и код для этого определения и выполните полную перестройку на тот случай, если предварительно скомпилированный заголовок не был перестроен при изменении конфигурации.   -  person gigaplex    schedule 25.09.2015


Ответы (1)


Я не думаю, что GetModuleHandle(szModule) иметь будущее - хорошая идея.

Попробуйте вместо char *szModule; использовать GetModuleHandleA(szModule).

person MikeCAT    schedule 25.09.2015
comment
Работал отлично. Хотите уточнить, чем он отличается? - person Per Andreasen; 25.09.2015
comment
GetModuleHandle — это макрос, который становится либо GetModuleHandleA, либо GetModuleHandleW. GetModuleHandleA явно использовать ASCII (char). - person MikeCAT; 25.09.2015