【问题标题】:How to pass a char* to the GetModuleHandle function?如何将 char* 传递给 GetModuleHandle 函数?
【发布时间】:2015-12-22 19:33:48
【问题描述】:

我只是想根据一个字符串来获取模块信息,这个字符串很可能是“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. (LPCWSTR)szModule 一样铸造szModule。这使得程序构建成功,但它没有按预期工作。

  3. 通过将参数替换为静态 L"somefile.exe" 来使用 unicode。这很有效,但是,不用说它不是很实用。

我的问题是:如果szModulechar* 类型,我如何编译GetModuleHandle(szModule)

如果有帮助的话,我正在使用 Visual Studio 2015。

【问题讨论】:

  • 您需要像在第二个示例中那样投射它。如果szModuleconst char*,它会起作用吗?貌似GetModuleInfo不需要修改szModule,所以作为const char*应该是安全的。
  • 怎么用Unicode不太实用?这是在 Win32 中做事的首选方式。如果您坚持在代码库中使用 char* 字符串,则需要使用转换函数,例如 WideCharToMultiByte/MultiByteToWideChar。
  • @gigaplex 我并不是说使用 unicode 是不切实际的。我的意思是说在那里有一个静态字符串是不切实际的。最困扰我的是为什么将项目字符集设置为 使用多字节字符集 对我不起作用,但对许多其他使用 Visual Studio 2012 及以下版本的人有效。我想这样做,这样我就不必每次需要传递 LPCWSTR 时都编写 WideCharToMultiByte。
  • 如果你可以访问 MFC 或 ATL,你可以只使用一些包装类如 CString 或 CComBSTR 来省去手动转换的麻烦。否则,您可以编写自己的等效类。至于为什么在项目设置中切换到多字节对您不起作用,这听起来像是在弄乱 UNICODE #define。检查您的头文件和该定义的代码,并进行完全重建,以防在您更改配置时未重建预编译的头文件。

标签: c++ unicode wchar-t char-pointer lpcwstr


【解决方案1】:

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

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

【讨论】:

  • 完美运行。想详细说明它的不同之处吗?
  • GetModuleHandle 是一个宏,可以变成GetModuleHandleAGetModuleHandleWGetModuleHandleA 明确使用 ASCII(字符)。
猜你喜欢
  • 2023-03-29
  • 2019-12-11
  • 2012-07-26
  • 2023-03-06
  • 2012-05-10
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
相关资源
最近更新 更多