ダイアログベースで,コマンドライン引数により何も表示しないで終了する exe
次の様なコードで,AfxWinMain でエラーになってしまう.
BOOL CReszPicApp::InitInstance()
{
…
CReszPicDlg dlg;
m_pMainWnd = &dlg;
if (_tcslen(m_lpCmdLine) != 0) {
dlg.EnumDIB() ;
dlg.ResizeDIB() ;
return FALSE ;
}
INT_PTR nResponse = dlg.DoModal();
…
}
—————————
Microsoft Visual C++
—————————
ハンドルされていない例外 は ReszPic.exe (MFC42D.DLL) にあります: 0xC0000005: Access Violation。
—————————
OK
—————————
WinMain.cpp
int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
…
// Perform specific initializations
if (!pThread->InitInstance()) {
if (pThread->m_pMainWnd != NULL) {
TRACE0(“Warning: Destroying non-NULL m_pMainWnd\n”);
pThread->m_pMainWnd->DestroyWindow();
}
nReturnCode = pThread->ExitInstance();
goto InitFailure;
}
…
}
m_pMainWnd への設定より前に,サイレントモードでの動作を行えば良い.
CReszPicDlg dlg;
// m_pMainWnd = &dlg;
if (_tcslen(m_lpCmdLine) != 0) {
dlg.EnumDIB() ;
dlg.ResizeDIB() ;
return FALSE ;
}
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
Message クラスなどで,AfxGetMainWnd()->GetSafeHwnd()==NULL の時の判断が抜けていたので修正.
AfxGetMainWnd()==NULL は多くの所で対応しているが,
AfxGetMainWnd()->GetSafeHwnd()==NULL は抜けがかなりありそう.