2012-05-05 7 views
5

メイン関数の開始前に、派生CWinAppのコンストラクタを呼び出す必要があるのはなぜですか?私はこの動作を強制的に技術的な理由を探していますMFCではなぜCWinAppのグローバルインスタンスを作成する必要がありますか?

int WinMain() 
{ 
    CMainFrame* pMainFrame = new CMainFrame; 
    // etc ... 
} 


は、なぜそれが何かすることはできません。
編集:
明確にするには - 私がWin32 APIをMFCなしで​​使用している場合、メインウィンドウはWinMain内に作成されますが、違いは何ですか?

+0

おそらく 'CWinApp'のコンストラクタが' main'関数が実行される前に*実行されるようにします。しかし、私は実際にはわからない。私はそれが動作するかどうかを確認するためにこれを試みたことはありません。あなたは? –

+0

@CodyGrayはい私は試みた。 AfxWinMain内でアプリケーションがクラッシュする –

+0

ああ、Fredericの答えが予測する通りです。 'CWinApp'のコンストラクタは' AfxWinMain'によって期待されるいくつかの状態変数の値を設定しています。 –

答えて

3

基本的には、MFC設計者がライブラリ自体にアプリケーションのエントリポイント(WinMain()ではなくmain())を提供することを決めたため、ユーザーはそのエントリを書き込む必要がないためです。

アプリケーションの初期化および終了ロジックは、次に、ユーザーが提供するCWinApp - 由来のシングルトンのインスタンスのInitInstance()およびExitInstance()メソッドに再配置されます。このインスタンスは、前述のメソッド(およびメッセージループに入るためにRun())を呼び出し、それを使用して状態を格納するため(nCmdShow引数のように)、WinMain()が実行される前に存在しなければなりません。

CWinApp由来のインスタンスをグローバルスコープで定義すると、実行する時刻がWinMain()まで存在することを簡単に確認できます。

This articleには、MFCアプリケーションの起動時に何が起こるかについての追加情報があります。

関連する問題