我正在处理32位MFC VC2010应用程序中出现的零星生产问题。该应用程序在Windows Server 2008 R2 Standard SP1 64位上运行。

该问题是由于无法创建CWnd派生类引起的。发生故障时,AfxUnhookWindowCreate方法在CWnd::CreateEx中返回false。这是因为pThreadState-> m_pWndInit变量不是NULL。当HCBT_CREATEWND被钩住时,_AfxCbtFilterHook看起来应该将其设置为NULL,但似乎没有发生。我已经注销了CREATESTRUCT,并将其与发生故障与未发生故障以及参数基本相同的时间进行了比较。

是否有人对导致此问题的原因或如何确定原因有任何想法?谢谢!

BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,
LPCTSTR lpszWindowName, DWORD dwStyle,
int x, int y, int nWidth, int nHeight,
HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
{
...
if (!PreCreateWindow(cs))
{
    PostNcDestroy();
    return FALSE;
}

AfxHookWindowCreate(this);
HWND hWnd = ::AfxCtxCreateWindowEx(cs.dwExStyle, cs.lpszClass,
        cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy,
        cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams);
...
if (!AfxUnhookWindowCreate())
    PostNcDestroy();        // cleanup if CreateWindowEx fails too soon
...

BOOL AFXAPI AfxUnhookWindowCreate()
{
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
  #ifndef _AFXDLL
if (afxContextIsDLL && pThreadState->m_hHookOldCbtFilter != NULL)
{
    ::UnhookWindowsHookEx(pThreadState->m_hHookOldCbtFilter);
    pThreadState->m_hHookOldCbtFilter = NULL;
}
  #endif
if (pThreadState->m_pWndInit != NULL)
{
    pThreadState->m_pWndInit = NULL;
    return FALSE;   // was not successfully hooked
}
return TRUE;
}

LRESULT CALLBACK
_AfxCbtFilterHook(int code, WPARAM wParam, LPARAM lParam)
{
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
if (code != HCBT_CREATEWND)
{
    // wait for HCBT_CREATEWND just pass others on...
    return CallNextHookEx(pThreadState->m_hHookOldCbtFilter, code,
        wParam, lParam);
}

 ...
        pThreadState->m_pWndInit = NULL;

最佳答案

我将问题归结为此时不应该执行的窗口过程挂钩。

关于c++ - 为什么CWnd::CreateEx无法创建我的窗口?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13370578/

10-11 19:40