起動時のエラー処理

[戻る]
ビリー 2007/06/21(木) 17:36:32
開発環境はWinXP Pro SP2、VC++ .NET 2003/MFC SDIアプリケーションです。
ウインドウアプリ & VC++ の経験は半年弱の初心者です。

起動時にMainFrmのOnCreateで初期処理を行い、エラーの場合は
メッセージボックスを表示して終了する処理で悩んでいます。
質問としてはありがちだと思われますが、以下の条件を満たす方法はあるのでしょうか?

@.メッセージ表示中はアプリケーションのタスクがタスクバーに表示されること。
A.メッセージのOKボタンを押下して終了する時に、一瞬メインのウインドウが表示され
ないこと。

現状、この条件を実現する方法として以下があるのですが・・・

【初期処理とエラー判定を分けて行う方法】
<初期処理(MainFrmのOnCreate内)>
**********************************************************************
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    // << 省略 >>

    Init(this);    // 初期処理

    return 0;
}
**********************************************************************

<初期処理のエラー判定(CxxxDocのOnNewDocument内)>
**********************************************************************
BOOL CLotcateDoc::OnNewDocument()
{
    // << 省略 >>

    if (!CheckInit())    // 初期処理チェック
    {
        AfxMessageBox("エラーの為終了します。");
        return FALSE;
    }

    return TRUE;
}
**********************************************************************

ただ、OnNewDocumentは起動処理に1回呼び出されるものではない為
ここに記述することは避けたいと思います。

他によい実現手段があればご教授ください。
どうぞよろしくお願いします。

はいり 2007/06/22(金) 04:59:38
ウィンドウを生成する前の初期処理、エラー表示はCWinAppのInitInstanceで行えばよい
と思います。

ビリー 2007/06/22(金) 15:39:06
> はいりさん
ご指摘ありがとうございます。
確かにCWinAppのInitInstance内のProcessShellCommand前に行えばうまくいきます。

1点書き忘れてしまったのですが、私の作成するアプリは通信を行うのに
ウインドウハンドルを使用する為、どうしてもCMainFrameのOnCreateで初期処理を
行う必要があります。

つまり初期処理・エラー処理を行うタイミングは
「ウインドウハンドルの生成後 〜 ウインドウの表示前」の間となる為
CWinAppでいうとProcessShellCommandの中で行うことになるかと思います。

アプリケーションウィザードで自動生成されるメソッドをトレースすると
起動時のProcessShellCommand内では以下の順番で処理されているようです。

CMyApp::InitInstance - ProcessShellCommand[Start]
CMyDoc::CMyDoc
CMainFrame::CMainFrame
CMainFrame::PreCreateWindow
CMainFrame::PreCreateWindow
CMainFrame::OnCreate
CMyView::CMyView
CMyView::PreCreateWindow
CMainFrame::"エラーメッセージ表示"
CMyDoc::OnNewDocument
CMyView::OnInitialUpdate
CMyView::DoDataExchange
CMyView::OnUpdate
CMyApp::InitInstance - ProcessShellCommand[End]

「CMainFrame::"エラーメッセージ表示"」はOnCreate内で出したメッセージです。
このメッセージ表示後のタイミングでうまくロジックを組むことはできないのでしょうか?

2007/06/22(金) 21:42:40
MainFrmのOnCreateで-1を返す、というのは?
別の要らないメッセージが出るような気もしますが、これでメインウィンドウの表示
は行われないかと。
あんまMFC使わない上にVC6.0の話なのでこれでいいのかは知りませんが…。


とりあえず以下VC6.0のMSDNから

OnCreate 関数は、CWnd オブジェクトの作成を続けるためには 0 を返さなけ
ればいけません。アプリケーションが -1 を返した場合は、ウィンドウは破棄されま
す。

Create または CreateEx メンバ関数を呼び出して Windows のウィンドウを作
成する要求をアプリケーションが行ったときに、フレームワークよりこのメンバ関数
が呼び出されます。
ウィンドウが作成された後で、それが可視状態になる前に、新しい CWnd オブ
ジェクトはこの呼び出しを受け取ります。

はいり 2007/06/25(月) 07:28:11
一瞬の表示を抑止するために直接OpenDocumentFileを呼び出すってのも
ありますが、善悪はわからないです。
全然ダメなやりかたでしたら皆様否定をお願いします。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    // << 省略 >>

    m_bActive = Init(this);    // 初期処理 成功はTRUEをいれる

    return 0;
}

BOOL CttuApp::InitInstance()
{
  CMainFrame* pMain ;

  ・・・

  CCommandLineInfo cmdInfo;
  ParseCommandLine(cmdInfo);

  if(cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)
  {
    pDocTemplate->OpenDocumentFile(NULL,FALSE);
  }
  else
  {
    if (!ProcessShellCommand(cmdInfo))
      return FALSE;
  }

  pMain = (CMainFrame*)m_pMainWnd ;
  if(!pMain->m_bActive)
  {
    AfxMessageBox("失敗しました");
    return FALSE;
  }

  m_pMainWnd->ShowWindow(SW_SHOW);
  m_pMainWnd->UpdateWindow();

たいちう 2007/06/25(月) 10:10:39
> ただ、OnNewDocumentは起動処理に1回呼び出されるものではない為
> ここに記述することは避けたいと思います。

小手先の技でよければ、こんな方法も。

BOOL CLotcateDoc::OnNewDocument()
{
    // << 省略 >>
    static bool first = true;
    if (first) {
        first = false;
        if (!CheckInit())    // 初期処理チェック
        {
            AfxMessageBox("エラーの為終了します。");
            return FALSE;
        }
    }
    return TRUE;
}

lng 2007/06/27(水) 11:29:23
一瞬表示については、ProcessShellCommand前に
m_nCmdShow = SW_HIDE;
とすることで隠せたと思います。

たろー 2007/07/05(木) 15:19:15
はじめまして
こんなトラブになってしまいました
パソコンを立ち上げるとこんなエラーメッセイジが出ました

MSM SGS アプリケーションエラー

アプリケーションを正しく初期化出来ませんでした(0xo0000034) (OK)をクリックして
アプリケーションを終了してください 言うものが出てから

マイドキュメントの写真がアイコンのまま表示されなくなってしまいました
ソフトを選ぶと写真が見られますが

ムービーメーカーが起動しなくなってしまいました

何方か解決策をよろしくお願いします

古いスレッドには追加発言できません。