VS.NET2003です。
登場するプログラムは以下です。
・EXE→メインとなるアプリ
・レギュラーDLL①→CMainFrameを持つサブアプリ
・レギュラーDLL②→関数のみ
EXE起動させるとメインフレームが2つになります。
EXEからDLL①をロードするとCMainFrame(DLL①)のOnCloseが自動的に呼ばれるのですが、
EXEからDLL②をロードし、DLL②からDLL①をロードするとOnCloseが呼ばれません。
DLL①自身で無理やりOnCloseを呼んでもダメでした。
原因がわかる方いらっしゃいましたらお願い致します。
例えばの話。
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①) が上記の様な扱いをされている可能性は無いかい?
ツイート | ![]() |