首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在从属性类型调用afxmessagebox到扩展dll时mfc死锁?

为什么在从属性类型调用afxmessagebox到扩展dll时mfc死锁?
EN

Stack Overflow用户
提问于 2016-09-27 07:25:52
回答 1查看 439关注 0票数 0

我有一个mfc应用程序,一个带有模态对话框的扩展dll。在这个对话框中是一个PropertySheet。其中一个属性页是从一个扩展dll加载的。进入扩展DLL中的是另一个属性表。如果我想在dll的poperty表中打开一个AfxMessageBox,则应用程序挂起。我认为这是一个僵局。操作系统是Windows 7. IDE 2012

以下是CallStack的几行代码。

代码语言:javascript
复制
>   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派生出来的。

代码语言:javascript
复制
    void CPropStkList::OnBnClicked()
{
    //BOOL test = TryEnterCriticalSection(AfxGetThread());
    AfxMessageBox(_T("Hallo Test!!"));

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

下面是父应用程序的代码,其中调用DLL-对话框.

代码语言:javascript
复制
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中

代码语言:javascript
复制
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;
}

在调试应用程序数小时后更新--我发现Applicaion发送了一些消息。它永远不会以发送信息而结束。这是发送的信息。

代码语言:javascript
复制
    <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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-04 16:10:38

我找到了解决我的问题的办法。您必须将外挂样式的WS_EX_CONTROLPARENT添加到任何有子元素的元素(控件)中。

代码语言:javascript
复制
ModifyStyleEx(0, WS_EX_CONTROLPARENT);

如果这不起作用的话,你就得照顾许多孩子了。在MFC中,超过三个是非常困难的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39718582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档