sweting
sweting

Reputation: 390

Why mfc deadlock when calling a afxmessagebox from propertypage into a extension dll

I have a mfc Application an a extension dll with a modal Dialog. In this Dialog is a PropertySheet. One of the Property-Pages is loaded from a extnsion dll. Into the Extension DLL is an other property sheet. If I want to open a AfxMessageBox into the poperty sheet of the dll the application hang. I think there is an deadlock. The OS is Windows 7. IDE Visual-Studio 2012

Here are some lines of the 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++

Here is some Code from the DLL. CPropStkList is derived from CPropertyPage.

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

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

And here is the Code of the Parent-Application where calls the DLL-Dialog.

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

Creation of the Dialog into the 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 After hours of debugging the Application i founnd that the Applicaion Sends some Messages. It never ends with sending messages. Here are the sended Messages.

    <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

Upvotes: 0

Views: 515

Answers (1)

sweting
sweting

Reputation: 390

I found a solution fo my problem. You have to add to every element (control) that has any children the extern style WS_EX_CONTROLPARENT.

ModifyStyleEx(0, WS_EX_CONTROLPARENT);

If that doesn't work you have to many subchildren. More than three is very difficult in MFC.

Upvotes: 1

Related Questions