直接上一段神奇的代码,用于获取模块句柄
#if _MSC_VER >= 1300 // for VC 7.0
// from ATL 7.0 sources
#ifndef _delayimp_h
extern "C" IMAGE_DOS_HEADER __ImageBase;
#endif
#endif
HMODULE GetCurrentModule()
{
#if _MSC_VER < 1300 // earlier than .NET compiler (VC 6.0)
// Here's a trick that will get you the handle of the module
// you're running in without any a-priori knowledge:
// http://www.dotnet247.com/247reference/msgs/13/65259.aspx
MEMORY_BASIC_INFORMATION mbi;
static int dummy;
VirtualQuery(&dummy, &mbi, sizeof(mbi));
return reinterpret_cast<HMODULE>(mbi.AllocationBase);
#else // VC 7.0
// from ATL 7.0 sources
return reinterpret_cast<HMODULE>(&__ImageBase);
#endif
}
然后解析模块名
void ParseModuleName()
{
TCHAR strFilePath[MAX_PATH];
memset(strFilePath, 0, MAX_PATH);
DWORD len = ::GetModuleFileName(GetCurrentModule(), strFilePath, MAX_PATH);
m_strFullPathName = std::wstring(strFilePath);
std::string::size_type iIndex = m_strFullPathName.find_last_of(L"\\");
if (iIndex != std::string::npos)
{
m_strFullPath = m_strFullPathName.substr(0, iIndex + 1);
m_strDllNameExt = m_strFullPathName.substr(iIndex + 1, m_strFullPathName.length());
m_strDllName = m_strDllNameExt.substr(0, m_strDllNameExt.length() - 4);
}
}