多重起動防止の策はいろいろあるが,その1つとしてウィンドウクラス名での防止を考える.
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
WNDCLASS c_wndclass;
static char szMyClassName[] = "MyAppClass";
GetClassInfo(AfxGetInstanceHandle(), "AfxFrameOrView", &c_wndclass);
c_wndclass.lpszMenuName = NULL;
c_wndclass.lpszClassName = szMyClassName;
RegisterClass(&c_wndclass);
cs.lpszClass = szMyClassName;
return CFrameWnd::PreCreateWindow(cs);
}
メインフレームウインドウは cs.lpszClass の名前を持つ WNDCLASS 構造体の情報を元に作成されるから,cs.lpszClass の名前を変更するだけでは駄目で,その名前を持つ WNDCLASS 構造体をあらかじめ作成しておく必要がある.
"AfxFrameOrView" は WINCORE.CPP にて
const char BASED_CODE _afxWndFrameOrView[] = "AfxFrameOrView";
このように定義してある.
多重起動は CWinApp::InitInstance() で調べる.
BOOL CFooApp::InitInstance()
{
char szMyClassName[] = "MyAppClass";
CWnd* pWnd;
if(m_hPrevInstance) {
pWnd = m_pMainWnd->FindWindow(szMyClassName, NULL);
if(pWnd) {
pWnd->IsIconic() ?
pWnd->ShowWindow(SW_SHOWNORMAL) : pWnd->BringWindowToTop();
return FALSE;
}
}
....
}
参照
多重起動防止