【发布时间】: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”类型的参数不兼容。
现在,我尝试了许多步骤,例如:
转到项目属性 → 配置属性 → 字符集并将其设置为 使用多字节字符集 而不是 Unicode。我看到它帮助了其他人,但它对我没有用。
像
(LPCWSTR)szModule一样铸造szModule。这使得程序构建成功,但它没有按预期工作。通过将参数替换为静态
L"somefile.exe"来使用 unicode。这很有效,但是,不用说它不是很实用。
我的问题是:如果szModule 是char* 类型,我如何编译GetModuleHandle(szModule)?
如果有帮助的话,我正在使用 Visual Studio 2015。
【问题讨论】:
-
您需要像在第二个示例中那样投射它。如果
szModule是const 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