こんなときの原因は何と思いますか? – プログラミング – Home

こんなときの原因は何と思いますか?
 
通知
すべてクリア

こんなときの原因は何と思いますか?


ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

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では起きません

わかりにく文かもしれませんが、何方かここはどう?とか
ここらへん調べろでも、なんでもいいのでヒントになる情報おまちしてます

よろしくお願いします。


引用解決済
トピックタグ
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

「なんでもいいので」ということなので、ハズしていることを覚悟の上で。

1つのウィンドウを2回以上destroyしていませんか?


返信引用
ナオーバ
 ナオーバ
(@ナオーバ)
ゲスト
結合: 23年前
投稿: 187
Topic starter  

ありがとうございます。

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)
する原因は何がありますか?

よろしくお願いします。


返信引用
Loreley
 Loreley
(@Loreley)
ゲスト
結合: 22年前
投稿: 4
 

最初に断っておきますが、私もたんなる勘です(^^;
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の宣言がないと例外がおきました。
(まぁこの場合は、常になんですけど。)

見当違いなことを書いているかもしれません。がその場合はすいません。


返信引用
Loreley
 Loreley
(@Loreley)
ゲスト
結合: 22年前
投稿: 4
 

すいません、上のレス、最初の 3行以外は無視してください。
起きたエラーが一般保護違反でないので、関係ないですね(^^;;;;;;
ゴミレス、申し訳ないです。


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

>すいません、上のレス、最初の 3行以外は無視してください。
いや、むしろ最初の3行で「ハズしてる気がする」と私は感じたんですが。

ナオーバさんが引用しているソースは
> BOOL CWnd::DestroyWindow()内の
とあるように、MFC内のソースです。ナオーバさんがおいそれと手をつけるべき所ではな
いのです。

でも、
>  if (m_pCtrlSite == NULL)
>  bResult = ::DestroyWindow(m_hWnd);   ←ここ
とあるのですから、m_pCtrlSiteとm_hWndが正当な値ではなくなっているのでは?と考え
るのはとっかかりとしてとても自然なことです。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました