MFC规则dll中获取当前模块句柄
2013-08-23 21:26
288 查看
对于普通规则的Dll,有需要的情况下通常会在DllMain中保存第一个参数hInstance的值,而MFC规则dll没有DllMain(准确来说是由MFC框架封装了),那该怎么拿到呢?
有人说GetModuleHandle(lpDllName)酱紫方法可以拿到。但是考虑一个问题,如果dll名字呗改了(极少数情况。。。),应该有种更好的方法。我们看MFC中给出的DllMain:
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\dllinit.cpp :
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
try
{
if (dwReason == DLL_PROCESS_ATTACH)
{
#ifdef _AFX_OLE_IMPL
BOOL bRegister = !coreDLL.bInitialized;
// shared initialization
AFX_MODULE_STATE* pModuleState = _AfxGetOleModuleState();
pModuleState->m_hCurrentInstanceHandle= hInstance;
pModuleState->m_hCurrentResourceHandle= hInstance;
pModuleState->m_pClassInit = pModuleState->m_classList.GetHead();
pModuleState->m_pFactoryInit = pModuleState->m_factoryList.GetHead();
#endif
我们发现,hInstance是被保存到 pModuleState中的这两个成员里面的:
AfxGetModuleState();
所以我们可以酱紫拿到hInstance:
BOOL CMFC_Handle_TestApp::InitInstance()
{
CWinApp::InitInstance();
AFX_MODULE_STATE* state = AfxGetModuleState();
cout << state->m_hCurrentInstanceHandle<< endl;
return TRUE;
}
有人说GetModuleHandle(lpDllName)酱紫方法可以拿到。但是考虑一个问题,如果dll名字呗改了(极少数情况。。。),应该有种更好的方法。我们看MFC中给出的DllMain:
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\src\mfc\dllinit.cpp :
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
try
{
if (dwReason == DLL_PROCESS_ATTACH)
{
#ifdef _AFX_OLE_IMPL
BOOL bRegister = !coreDLL.bInitialized;
// shared initialization
AFX_MODULE_STATE* pModuleState = _AfxGetOleModuleState();
pModuleState->m_hCurrentInstanceHandle= hInstance;
pModuleState->m_hCurrentResourceHandle= hInstance;
pModuleState->m_pClassInit = pModuleState->m_classList.GetHead();
pModuleState->m_pFactoryInit = pModuleState->m_factoryList.GetHead();
#endif
我们发现,hInstance是被保存到 pModuleState中的这两个成员里面的:
m_hCurrentInstanceHandle
m_hCurrentResourceHandle刚好MFC有个函数:
AfxGetModuleState();
所以我们可以酱紫拿到hInstance:
BOOL CMFC_Handle_TestApp::InitInstance()
{
CWinApp::InitInstance();
AFX_MODULE_STATE* state = AfxGetModuleState();
cout << state->m_hCurrentInstanceHandle<< endl;
return TRUE;
}
相关文章推荐
- MFC DLL 资源模块句柄切换
- 获取当前进程的模块句柄(获取当前模块的基址)
- 在MFC中获取窗口\视图句柄 &获取当前活动的CView .
- 获取当前模块句柄GetModuleHandle
- C++获取当前模块的路径(dll/exe)
- WinAPI: GetModuleHandle - 获取一个模块(exe 或 dll)的句柄
- AfxGetResourceHandle用于获取当前资源模块句柄,而AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄。
- 根据进程结合GetModuleHandle获取当前主模块句柄
- C++函数举例:获取当前模块句柄
- MFC 获取当前活动窗口的句柄
- 根据进程结合GetModuleHandle获取当前主模块的句柄
- WinAPI: GetModuleHandle - 获取一个模块(exe 或 dll)的句柄
- 获取当前dll句柄,遍历输入表
- GetModuleHandle(NULL)获取当前DLL模块基址?
- MFC 获取当前活动窗口的句柄
- 模块切换——MFC的规则DLL中资源使用的问题
- 获取当前模块的句柄
- 通过VirtualQuery获取当前模块的句柄
- 在MFC中获取窗口\视图句柄 &获取当前活动的CView
- 模块切换——MFC的规则DLL中资源使用的问题