C++ GetModuleBaseName dosen';不接受char*参数

C++ GetModuleBaseName dosen';不接受char*参数,c++,C++,我得到了这个密码: 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 = ne

我得到了这个密码:

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

尝试使用
GetModuleBaseNameA
(在尾部添加“A”)


GetModuleBaseNameA
明确使用ANSI字符,与
GetModuleBaseName
相反,
GetModuleBaseNameA
GetModuleBaseNameW

由@MikeCAT提供的答案回答了这个特定的问题,但我认为您以后可能会遇到问题,当您开始将
TCHAR
/
LPTSTR
-字符串(或
wchar\t
-字符串)与
char
-字符串混合时

如果您想使用
char
字符串,而不是
wchar\u t
字符串(MSVC称为“Unicode”),那么最好编写整个应用程序,使用其中一种,并将字符编码设置为相应的字符集,这可以在项目属性页中完成。”“多字节字符集”对应于
char
,“Unicode字符集”对应于
wchar\u t

这还有一个副作用,即
GetModuleBaseName
将自动切换到
char
-版本,即
GetModuleBaseName
。有相当多的Windows API根据此标志进行“切换”


因此,正确的解决方案很可能是将此标志设置为使用
char
版本,然后使用
GetModuleBaseName
,而不使用“A”。

项目属性,生成,使用多字节集。这修复了它,谢谢。当我能够回答这个问题时,我会接受答案。问题是MS似乎不赞成使用多字节字符集,至少在MFC项目中是这样。而且,您可能希望能够将代码从一个项目复制到另一个项目,而不必担心Unicode/MBCS设置。因此,在我看来,无论您将非TCHAR(或CString)文本传递到这些Win32函数中的任何一个,都应该显式地包含A或W后缀。@Christopher Roicles我想让这篇文章的内容简单一点。但是,如果您希望以可以直接复制代码的方式同时支持MBCS和Unicode,那么您需要完全以
TCHAR
-风格编写应用程序。使用这种样式,您永远不会使用显式的A或W版本,而是让宏为您选择;实际上,这是你在C++中使用Windows API时所做的事情。另一种选择是选择一种编码方式并继续使用。考虑到这是解释和使用的最简单的选项,我在这里推荐它。是的,尽可能使用TCHAR和CString,但有时您会发现自己有一个const char*或std::string(来自您正在使用的一些非MS库),并且您正在处理一个Unicode项目——是否更容易处理一个“a”在函数名的末尾,还是使用那些可怕的转换函数?
if (GetModuleBaseName(hProc, hModules[i], szBuf, sizeof(szBuf))) {