2016-09-27 18 views
0

我有一个mfc应用程序,它是一个带模态对话框的扩展dll。在这个对话框中是一个PropertySheet。其中一个Property-Pages从扩展dll中加载。进入扩展DLL是另一个属性表。如果我想打开一个AfxMessageBox到应用程序挂起的dll的属性表中。 我觉得有一个僵局。 操作系统是Windows 7. IDE Visual-Studio 2012为什么mfc在从属性页调用afxmessagebox到一个扩展dll时出现死锁

以下是CallStack的一些行。

> mfc110d.dll!_AfxTraceMsg(const char * lpszPrefix, const tagMSG * pMsg) Zeile 302 C++ 
mfc110d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Zeile 275 C++ 
mfc110d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Zeile 453 C++ 
mfc110d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Zeile 304 C++ 
user32.dll!76a362fa() Unnamed 
[The frames below are possible corrupted or not here. No symbols loaded foruser32.dll] 
user32.dll!76a36d3a() Unknown 
user32.dll!76a36ce9() Unknown 
user32.dll!76a3966e() Unknown 
user32.dll!76a396d5() Unknown 
user32.dll!76a6104b() Unknown 
user32.dll!76a60d62() Unknown 
user32.dll!76a61089() Unknown 
ntdll.dll!76f91171() Unknown 
user32.dll!76a362fa() Unknown 
ntdll.dll!76f91171() Unknown 
ntdll.dll!76f91171() Unknown 
ntdll.dll!76f91171() Unknown 
ntdll.dll!76f91171() Unknown 
user32.dll!76a36ce9() Unknown 
user32.dll!76a40d37() Unknown 
ntdll.dll!76f91171() Unknown 
ntdll.dll!76f91171() Unknown 
ntdll.dll!76f91171() Unknown 
mfc110d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Line 1141 C++ 
mfc110d.dll!CWnd::Default() Line 323 C++ 
mfc110d.dll!CWnd::OnActivate(unsigned int __formal, CWnd * __formal, int __formal) Line 368 C++ 
mfc110d.dll!CMFCPropertyPage::OnActivate(unsigned int nState, CWnd * pWndOther, int bMinimized) Line 73 C++ 
mfc110d.dll!CWnd::OnWndMsg(unsigned int message, unsigned int wParam, long lParam, long * pResult) Line 2540 C++ 
mfc110d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Line 2137 C++ 
mfc110d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 290 C++ 
mfc110d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 453 C++ 
mfc110d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Line 304 C++ 
user32.dll!76a362fa() Unknown 
user32.dll!76a36d3a() Unknown 
user32.dll!76a36ce9() Unknown 
comctl32.dll!71f771cb() Unknown 
comctl32.dll!71f33770() Unknown 
mfc110d.dll!CMapPtrToPtr::HashKey(void * key) Zeile 42 C++ 
mfc110d.dll!CMapPtrToPtr::GetValueAt(void * key) Zeile 180 C++ 
0058ca3c() Unbekannt 
user32.dll!76a362fa() Unknown 
user32.dll!76a5f963() Unknown 
user32.dll!76a5f91b() Unknown 
user32.dll!76a5f7a4() Unknown 
ntdll.dll!76f91171() Unknown 
user32.dll!76a362fa() Unknown 
ntdll.dll!76f91171() Unknown 
ntdll.dll!76f91171() Unknown 
ntdll.dll!76f91171() Unknown 
ntdll.dll!76f91171() Unknown 
user32.dll!76a36ce9() Unknown 
user32.dll!76a40d37() Unknown 
ntdll.dll!76f91171() Unknown 
ntdll.dll!76f91171() Unknown 
ntdll.dll!76f91171() Unknown 
mfc110d.dll!CWnd::DefWindowProcA(unsigned int nMsg, unsigned int wParam, long lParam) Zeile 1141 C++ 
mfc110d.dll!CWnd::WindowProc(unsigned int message, unsigned int wParam, long lParam) Zeile 2138 C++ 
mfc110d.dll!AfxCallWndProc(CWnd * pWnd, HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Zeile 290 C++ 
mfc110d.dll!AfxWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Zeile 453 C++ 
mfc110d.dll!AfxWndProcBase(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Zeile 304 C++ 
user32.dll!76a362fa() Unknown 
user32.dll!76a36d3a() Unknown 
user32.dll!76a36ce9() Unknown 
user32.dll!76a36ded() Unknown 
user32.dll!76a36e4c() Unknown 
ntdll.dll!76f3011a() Unknown 
user32.dll!76a4219a() Unknown 
user32.dll!76a8ef0a() Unknown 
user32.dll!76a362fa() Unknown 
user32.dll!76a5f9ff() Unknown 
user32.dll!76a5f91b() Unknown 
user32.dll!76a5f7a4() Unknown 
user32.dll!76a4afbc() Unknown 
user32.dll!76a362fa() Unknown 
user32.dll!76a36d3a() Unknown 
user32.dll!76a36ce9() Unknown 
user32.dll!76a40d37() Unknown 
user32.dll!76a4795a() Unknown 
mfc110d.dll!_AfxActivationWndProc(HWND__ * hWnd, unsigned int nMsg, unsigned int wParam, long lParam) Zeile 489 C++ 
user32.dll!76a362fa() Unknown 
user32.dll!76a36d3a() Unknown 
user32.dll!76a36ce9() Unknown 
user32.dll!76a3966e() Unknown 
user32.dll!76a6208f() Unknown 
user32.dll!76a5cf5b() Unknown 
user32.dll!76a8f808() Unknown 
user32.dll!76a8fae4() Unknown 
user32.dll!76a8fbe7() Unknown 
user32.dll!76a8fc66() Unknown 
user32.dll!76a8fdb9() Unknown 
user32.dll!76a8fdfe() Unknown 
mfc110d.dll!CWinApp::ShowAppMessageBox(CWinApp * pApp, const char * lpszPrompt, unsigned int nType, unsigned int nIDPrompt) Zeile 128 C++ 
mfc110d.dll!CWinApp::DoMessageBox(const char * lpszPrompt, unsigned int nType, unsigned int nIDPrompt) Zeile 45 C++ 
mfc110d.dll!AfxMessageBox(const char * lpszText, unsigned int nType, unsigned int nIDHelp) Zeile 147 C++ 

这里是DLL的一些代码。 CPropStkList来自CPropertyPage。

void CPropStkList::OnBnClicked() 
{ 
    //BOOL test = TryEnterCriticalSection(AfxGetThread()); 
    AfxMessageBox(_T("Hallo Test!!")); 

    //CDialog dlg(IDD_DIALOG2); 
    //dlg.DoModal(); 
} 

这里是调用DLL对话框的父应用程序的代码。

typedef UINT (* LPDLLFUNC)(CGlobal *, CMsgSocket *); //Initialize DLL 
    typedef CProSeSDialog * (* GETDLG)(CWnd*, UINT, CString); //Open Dialog from DLL 
    LPDLLFUNC  lpfnDllFunc = NULL; 
    GETDLG   getDlg = NULL; 
    HINSTANCE hDLL  = NULL;   
    hDLL = AfxLoadLibrary("Stammdaten_DLL.dll"); 
if(hDLL) 
     { 
      lpfnDllFunc = (LPDLLFUNC)::GetProcAddress(hDLL,"Init"); 
      getDlg  = (GETDLG)::GetProcAddress(hDLL, "ShowDlg"); 
      if (!lpfnDllFunc) 
      { 
       AfxMessageBox("Function not found in DLL"); 
       FreeLibrary(hDLL); 
       //return; 
      } 
      if(!getDlg) 
      { 
       AfxMessageBox("Function getDlg not found in DLL"); 
       FreeLibrary(hDLL); 
      } 
      lpfnDllFunc(AfxGetGlobal(), AfxGetGlobalSocket()); //Initialize DLL 
      dlg[i=GetNewDlgNr()] = getDlg(this, 1, _T("")); 

      m_strText[i] = INTLTXT ("Werkzeugstammdaten") + " DLL"; 



     } 
     else 
     { 
      AfxMessageBox("Dll not found!"); 
     } 

对话框的创作到DLL

extern "C" AFX_EXT_API CProSeSDialog* ShowDlg(CWnd *parent, UINT dlgType = 0, CString strKey = _T("")) 
{ 

    new CDynLinkLibrary(Stammdaten_DLLDLL); 


    //Lege Einstiegsdaten fest 
    CGlobalKeyBuffer &buffer = CGlobalKeyBuffer::Instance(); 
    buffer.m_strKey = strKey; 

    CViewDlg *test = new CViewDlg(WKZSTAMM); 
    test->Create(IDD_DIALOG1, parent); 


    return test; 
} 

UPDATE 后调试我founnd该广告应用程式发送一些消息的应用程序的小时。它永远不会以发送消息结束。 这是发送的消息。

<025111> 001F1316 S WM_GETDLGCODE 
<025112> 001F1316 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_HASSETSEL | DLGC_WANTCHARS 
<025113> 001F1314 S WM_GETDLGCODE 
<025114> 001F1314 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_HASSETSEL | DLGC_WANTCHARS 
<025115> 00201312 S WM_GETDLGCODE 
<025116> 00201312 R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<025117> 001E130C S WM_GETDLGCODE 
<025118> 001E130C R WM_GETDLGCODE fuDlgCode:DLGC_WANTARROWS | DLGC_WANTCHARS 
<025119> 001F1308 S WM_GETDLGCODE 
<025120> 001F1308 R WM_GETDLGCODE fuDlgCode:DLGC_STATIC 
<025121> 001F1306 S WM_GETDLGCODE 
<025122> 001F1306 R WM_GETDLGCODE fuDlgCode:DLGC_STATIC 
<025123> 001E1304 S WM_GETDLGCODE 
<025124> 001E1304 R WM_GETDLGCODE fuDlgCode:DLGC_STATIC 
<025125> 001F1302 S WM_GETDLGCODE 
<025126> 001F1302 R WM_GETDLGCODE fuDlgCode:DLGC_STATIC 
<025127> 00211300 S WM_GETDLGCODE 
<025128> 00211300 R WM_GETDLGCODE fuDlgCode:DLGC_STATIC 
<025129> 001E12FE S WM_GETDLGCODE 
<025130> 001E12FE R WM_GETDLGCODE fuDlgCode:DLGC_STATIC 
<025131> 001E12FC S WM_GETDLGCODE 
+1

你可以将这些callstack转换为英文吗? – Danh

+1

请添加一些代码! – Danh

+1

很难猜测跟踪如何可能导致死锁。启用Microsoft Symbol Server以获得更好的堆栈跟踪。并且认为它可能根本就不是死锁,因为它看起来不像它,但是消息框具有错误的所有者并显示在主窗口下面。看起来像一个挂起,因为你不能再做任何事情。使用调试器而不是消息框来验证代码是否运行,并设置断点。 –

回答

0

我找到了解决我的问题的解决方案。 您必须添加到每个具有任何子元素(控件)的外部样式 WS_EX_CONTROLPARENT。

ModifyStyleEx(0, WS_EX_CONTROLPARENT); 

如果这不起作用,你必须有许多子女。 MFC中超过三个是非常困难的。

相关问题