2015-09-25 46 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. 将项目属性→配置属性→字符集并将其设置为使用多字节字符集,而不是统一。我已经看到它帮助其他人,但它并没有为我做伎俩。

  2. 铸造类似(LPCWSTR)szModule的sz模块。这使得该程序的构建成功,但它没有按预期工作。

  3. 使用unicode通过用静态L"somefile.exe"替换参数。但是,这很好地工作,不用说这很不实际。

我的问题是:怎样才能让GetModuleHandle(szModule)编译如果szModulechar*类型的?

我使用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及更少版本的人员工作。我想这样做,所以每次我需要传递一个LPCWSTR时,我不必写WideCharToMultiByte。 –

回答

2

我不认为制作GetModuleHandle(szModule)有未来是个好主意。

尝试使用GetModuleHandleA(szModule)代替char *szModule;

+0

完美工作。仔细阐述它有什么不同? –

+0

'GetModuleHandle'是一个变成“GetModuleHandleA”或“GetModuleHandleW'的宏。 'GetModuleHandleA'显式使用ASCII(char)。 – MikeCAT