2015-09-25 5 views
1

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

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

Ошибка аргумента типа «символ *» несовместим с параметром типа «LPCWSTR» появляется в GetModuleHandle.

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

  1. Going в Свойства проекта → Свойства конфигурации → Набор символов и настройки его Многобайтовые Набор символов, а не Unicode. Я видел, как это помогало другим людям, но это не помогло мне.

  2. Кастинг szModule как (LPCWSTR)szModule. Это сделало программу успешной, однако она не работала так, как предполагалось.

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

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

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

+0

Вам нужно будет бросить его, как в вашем втором примере. Он работает, если 'szModule' является' const char *' вместо этого? Не похоже, что 'GetModuleInfo' должен изменить' szModule', поэтому он должен быть безопасным как 'const char *'. – Tas

+0

Как использовать Unicode не очень практично? Это предпочтительный способ делать вещи в Win32. Если вы настаиваете на использовании символов char * в своей кодовой базе, вам понадобятся функции преобразования, такие как WideCharToMultiByte/MultiByteToWideChar. – gigaplex

+0

@gigaplex Я не хотел сказать, что использовать unicode было непрактично. Я хотел сказать, что нет практической статической строки. Меня больше всего беспокоит то, что установка символа проекта на ** Использовать многобайтовый набор символов ** не работала для меня, но работала для многих других людей, которые использовали Visual Studio 2012 и меньше. Я хочу сделать это, поэтому мне не нужно писать WideCharToMultiByte каждый раз, когда мне нужно передать LPCWSTR. –

ответ

2

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

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

+0

Работал отлично. Поразмыслить над тем, как все иначе? –

+0

'GetModuleHandle' - это макрос, который превращается в' GetModuleHandleA' или 'GetModuleHandleW'. 'GetModuleHandleA' явно использует ASCII (char). – MikeCAT