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))) {