GetModuleBaseName不要使用char *参数

时间:2015-09-26 14:21:53

标签: c++

我收到了这段代码:

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

2 个答案:

答案 0 :(得分:3)

尝试使用GetModuleBaseNameA(添加&#34; A&#34;尾部)。

GetModuleBaseNameA相比,

GetModuleBaseName明确使用ANSI字符,这是一个宏GetModuleBaseNameAGetModuleBaseNameW

答案 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;。