2016-09-27 20 views
0

私はmfcアプリケーションにモーダルダイアログを持つ拡張DLLを持っています。このダイアログでは、PropertySheetです。 Property-Pagesの1つはextnsion dllから読み込まれます。 Extension DLLには、他のプロパティシートがあります。私がAfxMessageBoxをdllのpopertyシートに開くには、アプリケーションがハングします。 デッドロックがあると思います。 OSはWindows 7です。 IDE Visual Studio 2012なぜffxmessageboxをpropertypageから拡張DLLに呼び出すときにmfcデッドロックが発生する

ここには、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-Dialogを呼び出す親アプリケーションのコードです。 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; 
} 

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!"); 
     } 

ダイアログの作成はUPDATE iはApplicaionは、いくつかのメッセージを送信することを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

これらのコールスタックを英語に変換できますか? – Danh

+1

そしていくつかのコードを追加してください! – Danh

+1

トレースがどのようにデッドロックを引き起こすかを推測するのはかなり難しいです。 Microsoft Symbol Serverを有効にして、より良いスタックトレースを取得します。そのように見えないので、デッドロックではないかもしれないと考えてください。しかし、メッセージボックスには間違った所有者があり、メインウィンドウの下に表示されます。もう何もできないので、ハングアップのように見えます。メッセージボックスの代わりにデバッガを使用して、コードが実行されていることを確認し、ブレークポイントを設定します。 –

答えて

0

私の解決策が見つかりました。 外部スタイル WS_EX_CONTROLPARENTの子を持つすべての要素(コントロール)に追加する必要があります。

ModifyStyleEx(0, WS_EX_CONTROLPARENT); 

これでうまくいかない場合は、多くの子どもが必要です。 MFCでは3つ以上が非常に困難です。

関連する問題