CodeGuruやCodeProjectなどを利用してVCのような概観のアプリを作成しています。
ドッキングウィンドウは4つ有って、うち2つがプロパティウィンドウもどきの
ビューを持っています。
他に普通のビュー一つです(VCで言うとソース書くところ)
問題はプロパティウィンドウもどきが2つのときに普通のビューのところを切り替えた後
アプリを終了すると異常終了します。
切り替えないで終了した場合は問題は起きません
異常終了の原因と思われる個所は
ドッキングウィンドウが持っているCFrameWndを破棄するときに起き
BOOL CWnd::DestroyWindow()内の
#ifdef _AFX_NO_OCC_SUPPORT
BOOL bResult = ::DestroyWindow(m_hWnd);
#else //_AFX_NO_OCC_SUPPORT
BOOL bResult;
if (m_pCtrlSite == NULL)
bResult = ::DestroyWindow(m_hWnd); ←ここ
else
bResult = m_pCtrlSite->DestroyControl();
#endif //_AFX_NO_OCC_SUPPORT
プロパティウィンドウもどきが一つやゼロの時は起きません。
このバグ?は変でして、プロパティウィンドウもどきを持っている
ドッキングウィンドウの破棄は普通に終了して、
次のドッキングウィンドウの破棄で異常終了します。
WIN98SEではおきて、2000,Meでは起きません
わかりにく文かもしれませんが、何方かここはどう?とか
ここらへん調べろでも、なんでもいいのでヒントになる情報おまちしてます
よろしくお願いします。
「なんでもいいので」ということなので、ハズしていることを覚悟の上で。
1つのウィンドウを2回以上destroyしていませんか?
ありがとうございます。
BOOL CWnd::DestroyWindow()を呼ぶ関数
void CDocument::OnCloseDocument()内の
CFrameWnd* pFrame = pView->GetParentFrame();
ASSERT_VALID(pFrame);
で中身をチェックしているし、
BOOL CWnd::DestroyWindow()内の
bResult = ::DestroyWindow(m_hWnd);
のm_hWndも値があるので、ウィンドウを2回以上destroyしている事は
無いと思います。
単純に ::DestroyWindow(m_hWnd) をした時に異常終了(一般保護違反 GDI.exe)
する原因は何がありますか?
よろしくお願いします。
最初に断っておきますが、私もたんなる勘です(^^;
m_hWnd の変数名って変更可能ですか?
m_hWnd が怪しい気がするんですが。
たしか m_hWndって宣言なしでもコンパイル通るんですよ。
(MFCのほかの部分で宣言されているため)
それ(MFCで作成されたもの)を利用しているのであれば私の見誤りですが、
自分で用意しているものであれば、それではないかな。と思います。
ためしに、MFCでMDIで新規作成して、
void CMDIFrameWnd::OnDestroy()
{
HWND m_hWnd;/*ここがないと例外(コンパイルは通る)*/
#ifdef _AFX_NO_OCC_SUPPORT
BOOL bResult = ::DestroyWindow(m_hWnd);
#else //_AFX_NO_OCC_SUPPORT
BOOL bResult;
//if (m_pCtrlSite == NULL)
bResult = ::DestroyWindow(m_hWnd);//←ここ
//else
// bResult = m_pCtrlSite->DestroyControl();
#endif //_AFX_NO_OCC_SUPPORT
}
だけ追加というむちゃくちゃな(苦笑)ことをしてみましたが、
(あくまでためしにですから。(^^;)
コメントにあるとおり、m_hwndの宣言がないと例外がおきました。
(まぁこの場合は、常になんですけど。)
見当違いなことを書いているかもしれません。がその場合はすいません。
すいません、上のレス、最初の 3行以外は無視してください。
起きたエラーが一般保護違反でないので、関係ないですね(^^;;;;;;
ゴミレス、申し訳ないです。
>すいません、上のレス、最初の 3行以外は無視してください。
いや、むしろ最初の3行で「ハズしてる気がする」と私は感じたんですが。
ナオーバさんが引用しているソースは
> BOOL CWnd::DestroyWindow()内の
とあるように、MFC内のソースです。ナオーバさんがおいそれと手をつけるべき所ではな
いのです。
でも、
> if (m_pCtrlSite == NULL)
> bResult = ::DestroyWindow(m_hWnd); ←ここ
とあるのですから、m_pCtrlSiteとm_hWndが正当な値ではなくなっているのでは?と考え
るのはとっかかりとしてとても自然なことです。