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