我收到了这段代码:
gvim --remote-silent
在此行上失败,告诉我char *与LPWSTR不兼容
DWORD64 GetModuleBase(HANDLE hProc, string &sModuleName)//For 64bit process
{
HMODULE *hModules;
hModules = 0;
char szBuf[50];
DWORD cModules = 0;
DWORD64 dwBase = 0;
EnumProcessModules(hProc, hModules, 0, &cModules);
hModules = new HMODULE[cModules / sizeof(HMODULE)];
if (EnumProcessModules(hProc, hModules, cModules / sizeof(HMODULE), &cModules)) {
for (int i = 0; i < cModules / sizeof(HMODULE); i++) {
if (GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) {
if (sModuleName.compare(szBuf) == 0) {
dwBase = (DWORD64)hModules[i];
break;
}
}
}
}
delete[] hModules;
return dwBase;
}
我已经在很长一段时间内在另一个项目中使用它并且它工作正常,但我最近搬到了一个新的,我得到了这个问题。不知道该怎么办。在szbuf旁边添加(LPWSTR)只会使dll崩溃。
我正在使用VS 2013
答案 0 :(得分:3)
尝试使用GetModuleBaseNameA
(添加&#34; A&#34;尾部)。
GetModuleBaseNameA
相比, GetModuleBaseName
明确使用ANSI字符,这是一个宏GetModuleBaseNameA
或GetModuleBaseNameW
。
答案 1 :(得分:0)
@MikeCAT的回答回答了这个具体问题,但我认为您可能会在以后开始混合TCHAR
/ LPTSTR
- 字符串(或wchar_t
- 字符串时遇到问题)char
- 字符串。
如果您想使用char
字符串而非wchar_t
字符串(称为&#39; Unicode&#39; MSVC),那么编写整个应用程序可能是个好主意使用其中一个或另一个并将Character Encoding设置为相应的字符集,这可以在项目属性页面中完成。 &#39;多字节字符集&#39;对应于char
和&#39; Unicode字符集&#39;对应wchar_t
。
这也会产生副作用,即GetModuleBaseName
会自动切换到char
版本,即GetModuleBaseNameA
。有很多Windows API可以切换&#39;取决于这面旗帜。
因此,正确的解决方案最有可能将此标记设置为使用char
版本,然后使用GetModuleBaseName
,而不使用&#39; A&#39;。