Mfc FromHandlePermant在注入的DLL中始终返回null

Mfc FromHandlePermant在注入的DLL中始终返回null,mfc,inject,afx,Mfc,Inject,Afx,我正在编写一个测试自动化程序,该程序必须与遗留MFC应用程序中的网格控件交互。我的程序必须连接到旧版应用程序,并从网格读取数据 我知道包含网格的窗口的HWND,所以现在我需要找到与该HWND关联的CWnd派生类指针。CWnd::FromHandlePermant似乎是我的朋友,但我知道,您不能从应用程序外部调用CWnd::FromHandlePermant,因为AFX窗口映射afxMapHWND仅包含在目标应用程序中 因此,我使用CreateRemoteThread/LoadLibrary将DL

我正在编写一个测试自动化程序,该程序必须与遗留MFC应用程序中的网格控件交互。我的程序必须连接到旧版应用程序,并从网格读取数据

我知道包含网格的窗口的HWND,所以现在我需要找到与该HWND关联的CWnd派生类指针。CWnd::FromHandlePermant似乎是我的朋友,但我知道,您不能从应用程序外部调用CWnd::FromHandlePermant,因为AFX窗口映射afxMapHWND仅包含在目标应用程序中

因此,我使用CreateRemoteThread/LoadLibrary将DLL注入目标应用程序,并让它从HandlePermant调用。但即使这样也不够好,因为我不在HWND的线程中,而afxMapHWND正在查看错误的本地线程存储

因此,在我的注入DLL中,我还临时将HWND SetWindowLong等的WndProc子类化,然后调用SendMessage。现在我在目标应用程序的主线程的正确线程中,我尝试用我的HWND调用CWnd::FromHandlePermant,但它返回NULL!! 如果我看afxMapHWND->m_permanentMap->m_nCount,我们看到它是0。所以permanentMap中没有附加类,这在我看来是错误的

那么如何获得派生的CWnd指针

其他一些信息:

目标应用程序静态链接到MFC 这是MFC的另一个版本,windowclass是AfxWnd70s 我正在使用VS2010编译注入的DLL 注入的DLL还静态链接到VS2010 MFC库。 以下是注入的DLL中的代码:

// this is how we pass the HWND to the target DLL 
// (this shared segment is also loaded in calling app)
#pragma data_seg (".shared")
__declspec(dllexport) HWND  g_hWnd = 0;
#pragma data_seg ()

#pragma comment(linker,"/SECTION:.shared,RWS") 

BEGIN_MESSAGE_MAP(CLibSpyMFCDllApp, CWinApp)
END_MESSAGE_MAP()

CLibSpyMFCDllApp::CLibSpyMFCDllApp()
{
}
CLibSpyMFCDllApp theApp;

extern CHandleMap* PASCAL afxMapHWND(BOOL bCreate = FALSE);

UINT g_WM_GETGRIDDATA = 0;
WNDPROC wpOrigEditProc; 

LRESULT CALLBACK SpySubProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    if (g_WM_GETGRIDDATA != 0 && message == g_WM_GETGRIDDATA) {
        CWnd * target1 = CWnd::FromHandlePermanent(hWnd);
                // fails - target1 is null
        return 0;
    }
    return CallWindowProc((WNDPROC ) wpOrigEditProc, hWnd, message, wParam, lParam);
}

BOOL CLibSpyMFCDllApp::InitInstance()
{
    CoInitializeEx(NULL,  COINIT_APARTMENTTHREADED);
    CWinApp::InitInstance();

    if (g_hWnd) {
        g_WM_GETGRIDDATA = RegisterWindowMessage(L"GetGridData");
        wpOrigEditProc = (WNDPROC) SetWindowLong(g_hWnd, GWL_WNDPROC, (LONG) SpySubProc);
        ::SendMessage(g_hWnd, g_WM_GETGRIDDATA, 0, 0);
        SetWindowLong(g_hWnd, GWL_WNDPROC, (LONG) wpOrigEditProc); 
    }
    return TRUE;
}

您正在查看由DLL的MFC库维护的句柄映射。它与exe的MFC库维护的句柄映射不同。