在DLL中使用CWnd::FromHandlePermanentHWND来获得应用程序中的CWnd,而不要通过FromHandle
描述:
最近写了一个控件DLL,通过Hook的方法获得了EXE上的Button的HWND,为了更好地对按钮进行操作,我想要通过CWnd::FromHandlePermanent(HWND)
的方法得到该按钮的永久CWnd指针,而不是通过CWnd::FromHandle(HWND)获得的临时CWnd指针.
在控件DLL中使用CWnd::FromHandlePermanent(HWND)上碰到了问题.它总是返回NULL.当然该Button已经在EXE中被声明为CButton类对象了,
也就是说已经被子类化了.
出于无奈,我自己写了个同名的方法来供自己调用,在VC6.0的Debug版本中运行OK,而在Release和VC.net中均不能成功返回.
CWnd* CMyClass::FromHandlePermanent(HWND hWnd)
{
AFX_MODULE_THREAD_STATE* pState = ::AfxGetAppModuleState()->m_thread.GetData();//问题就在当前行!!!
CHandleMap* pMap = pState->m_pmapHWND;
CWnd* pWnd = NULL;
if (pMap != NULL)
{
pWnd = (CWnd*)pMap->LookupPermanent(hWnd);
ASSERT(pWnd == NULL || pWnd->m_hWnd == hWnd);
}
return pWnd;
}
也就是说在MFC42D.dll中是可行的,而在MFC42.dll和MFC71D.dll,MFC71.dll中是不行的.
请你能为我想个办法,在动态链接库中获得应用程序上窗口(HWND)的永久对象CWnd的指针吗?