2012-11-13 51 views
1

我正在处理32位MFC VC2010应用程序中出现的零星生产问题。该应用程序在Windows Server 2008 R2 Standard SP1 64位上运行。为什么CWnd :: CreateEx无法创建我的窗口?

该问题是由于未能创建CWnd派生类而导致的。发生故障时,AfxUnhookWindowCreate方法在CWnd :: CreateEx中返回false。这是因为pThreadState-> m_pWndInit变量不是NULL。它看起来像_AfxCbtFilterHook应该设置为NULL当HCBT_CREATEWND挂钩,但它似乎没有发生。我注销了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; 
+0

听起来像是一个线程问题:-) –

+0

@user你是否从主线程调用了'CWnd :: CreateEx'? – sashoalm

+0

是的,这发生在主线程上。有时窗口创建成功,有时它不在主线程的同一进程内。 – user1707438

回答

1

我将问题追踪到一个窗口过程挂钩,此时应该不会执行此操作。

+0

这是很久以前的事了,但你还记得你是如何设法找到违规钩子的吗?我有同样的问题。 – benrules2

+0

这个特定问题原来是由于Windows 64位堆栈限制造成的。挂钩不应该像应该挂钩一样。我搜索了SetWindowsHookEx调用来查找创建钩子的代码。以下文章有关于限制的更多信息:https://support.microsoft.com/en-us/kb/2664641 – user1707438

相关问题