我有一个mfc应用程序,一个带有模态对话框的扩展dll。在这个对话框中是一个PropertySheet。其中一个属性页是从一个扩展dll加载的。进入扩展DLL中的是另一个属性表。如果我想在dll的poperty表中打开一个AfxMessageBox,则应用程序挂起。我认为这是一个僵局。操作系统是Windows 7. IDE 2012
以下是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;
}在调试应用程序数小时后更新--我发现Applicaion发送了一些消息。它永远不会以发送信息而结束。这是发送的信息。
<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发布于 2016-10-04 16:10:38
我找到了解决我的问题的办法。您必须将外挂样式的WS_EX_CONTROLPARENT添加到任何有子元素的元素(控件)中。
ModifyStyleEx(0, WS_EX_CONTROLPARENT);如果这不起作用的话,你就得照顾许多孩子了。在MFC中,超过三个是非常困难的。
https://stackoverflow.com/questions/39718582
复制相似问题