掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
多重起動をOnInitDialogで行うには? (ID:67808)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
お世話になっております、Risです。 VC++6.0、MFC、ダイアログベースで勉強しています。 宜しくお願いします。 アプリケーションの多重起動を防止したく、 以下のような手順を踏んだのですが、メモリーリークしてしまいます。 自分なりに試行錯誤したのですが修正することが出来ませんでした。 まずダイアログベースで、test というアプリケーションを作成します。 testDlg.cpp の CTestDlg::OnInitDialog() 内で ::CreateMutex(NULL, TRUE, "MUTEX_NAME"); if (::GetLastError() == ERROR_ALREADY_EXISTS) { HWND hWnd = this->GetSafeHwnd(); if (hWnd) { TCHAR className[32]; GetClassName(hWnd, className, sizeof(className)); CWnd* cWndTarget = this->FindWindow(className, "APP_TITLE"); throw cWndTarget; } throw NULL; } this->SetWindowText("APP_TITLE"); return TRUE; そして、test.cpp の CTestApp::InitInstance() 内で、 try { dlg.DoModal(); } catch (CWnd*& cWndTarget) { if (cWndTarget) { if (cWndTarget->IsIconic()) { cWndTarget->ShowWindow(SW_RESTORE); } else { cWndTarget->SetForegroundWindow(); } } // AfxGetMainWnd()->PostMessage(WM_CLOSE); AfxGetMainWnd()->DestroyWindow(); } としました。 PostMessageからDestroyWindowに変えてあるのは、 calling DestroyWindow in CDialog::~CDialog -- OnDestroy or PostNcDestroy in derived class will not be called. というメッセージが出たのでMSDNで調べ、修正したからです。 (ここから間違っているかも知れません) それと、catch (CWnd*& cWndTarget) として参照を受け取っているのも、 参照を使わないとメモリリークするようなことが個人HPに書いてあったので こうなっております。 このメモリーリークを回避するにはどうしたらよいのでしょうか? どうぞ宜しくお願いします。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.