DLL固有のメインフレームの破棄


4NsuK  2010-10-24 03:48:34  No: 71996

VS.NET2003です。

登場するプログラムは以下です。
・EXE→メインとなるアプリ
・レギュラーDLL①→CMainFrameを持つサブアプリ
・レギュラーDLL②→関数のみ

EXE起動させるとメインフレームが2つになります。

EXEからDLL①をロードするとCMainFrame(DLL①)のOnCloseが自動的に呼ばれるのですが、
EXEからDLL②をロードし、DLL②からDLL①をロードするとOnCloseが呼ばれません。

DLL①自身で無理やりOnCloseを呼んでもダメでした。

原因がわかる方いらっしゃいましたらお願い致します。


gak  2010-10-26 03:03:55  No: 71997

例えばの話。

void showWindow(HWND parent) {
    CWnd window;
    window.CreateEx(0, AfxRegisterWndClass(0), TEXT(""), WS_OVERLAPPED | WS_VISIBLE, 0, 0, 100, 100, parent, NULL);
    window.PostMessage(WM_CLOSE);
}

上記の様なコードがあった場合、window::OnClose() は呼ばれない。以下其の理由。
1、PostMessage(WM_CLOSE) でメッセージキューに WM_CLOSE が置かれる
2、showWindow() を抜ける。同時に window インスタンスが破棄される
3、window::~window() で DestroyWindow() が実行される。
4、showWindow() を抜けた後、メッセージキュー に置かれた WM_CLOSE がディスパッチされる
5、だが送出先である window はもう死んでいる

実際にどんな構成で組まれているのか知らないので可能性に過ぎないが…
CMainFrame(DLL①) が上記の様な扱いをされている可能性は無いかい?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加