モードレスのダミーウィンドウを破棄するには?

[戻る]
TR 2001/04/24(火) 10:46:26
お世話になっております。
VC++6.0を始めて間もない者です。

現在作成しているDLLで困ったことが発生しております。
リリース版ではでない障害に悩まされています。
MFCソース内にてASSERTしており、解決方法がわかりません。
どなたか、私の処理の間違いをご指摘いただければ幸いです。
(経験者のかたから見るともしかするとおバカなことをしているかもしれませんが、
一人で煮詰まっており、困っています。どなたかお助けください)

マルチスレッド構成の通信DLL(TCPIP)を作成しました。
そのなかでWM_TIMERやWM_POWERBROADCASTといったメッセージを処理したく、
モードレスダイアログでダミーウィンドウを作成しました。
DLLが立ち上がる際にcreate。create後は特になにもせず、WM_TIMERとWM_POWERBROADCAST
の処理の為だけに存在しています。
(起動時)
m_pWnd = new CAAWin();
m_pWnd->Create(IDD_AADIALOG);

(処理中)
処理中の各種メッセージは正常に機能しています。

(終了時)
DLLを終了させる際にDLLのメイン内でDestroyWindowをCALL。
m_pWnd->DestroyWindow();

ウィンドウのソース側ではPostNcDestroyをオーバーライドしており、そのなかで
void CAAWin::PostNcDestroy()
{
     delete this
     CDIALOG::PostNcDestroy();
}

といった手順で処理しています。
すると・・デバッグ版でのみ、MFCのソース内にてASSERTしてしまいます。
wincore.cppの中のDestroyWindow()の
ASSERT(m_hWnd == hWndOrig);
で引っかかってます。

ASSERTですので当然リリース版では出ず、正常に終了しているかのように
見えています。

何が原因でこうなってしまうのでしょうか・・?
書籍やMSDN、サンプルなどとにらめっこしておりますが糸口が見つかりません。
よろしくご指南のほど、お願いします。

こん 2001/06/05(火) 11:25:13
オブジェクトの削除後に継承元のメソッドを呼ぶのは良くないと思います。
ですから、ウィンドウのソース側のオーバライドしたPostNcDestroy()の中で delete this; を実行するのではなく、
DLLを終了時の m_pWnd->DestroyWindow(); の後に delete m_pWnd; を実行するようにしてみて下さい。

古いスレッドには追加発言できません。