CXX.CWINAPP.INIT

CWinApp から派生したクラスで InitInstance オーバーライドが不正であるか、欠落しています。

CWinApp からアプリケーションクラスが派生する場合、InitInstance メンバー関数をオーバーライドしてアプリケーションのメインウィンドウオブジェクトを作成する必要があります。

脆弱性とリスク

これは以下のタイプの例外を引き起こします。これには、EXE アプリケーションだけでなく、MFC に動的にリンクされた通常の DLL も含まれます。

エラーコード: (NTSTATUS) 0xc015000f (3222601743) - アクティブ化解除の対象となっているアクティブ化コンテキストは、直近にアクティブ化されたものではありません。

エラーコード: (NTSTATUS) 0xc0150010 (3222601744) - アクティブ化解除の対象となっているアクティブ化コンテキストは、現在の実行スレッドではアクティブではありません。

エラーコード: (NTSTATUS) 0xc0150014 (3222601748) - 実行中の実行スレッドのアクティブ化コンテキストのアクティブ化スタックが壊れています。

軽減と防止

InitInstance 関数で AfxSetAmbientActCtx(FALSE)、afxAmbientActCtx = FALSE、または AfxGetModuleState()->m_bSetAmbientActCtx = FALSE を呼び出すことで、関係しているアクティブ化コンテキストを無効にする必要があります。この無効化が初期化前に実行されるようにするには、InitInstance() 内で最初の関数として呼び出す必要があります。

中間の基本クラスの場合、この規則は無視しても問題ありませんが、InitInstance() を純粋な仮想メソッドまたは抽象メソッドとして宣言しなければなりません。これによって、そのメソッドをなんらかの派生クラスによって定義する必要が生じます。

コピー
class CMMF_ImageCaptureApp : public CWinApp;
               
CMMF_ImageCaptureApp theApp;

BOOL CMMF_ImageCaptureApp::InitInstance()
{
  BOOL stat = i18nSetResourceHandle();
  AfxSetAmbientActCtx(FALSE);
  return CWinApp::InitInstance();
}

AfxSetAmbientActCtx が false に設定される前にオブジェクトの初期化が発生します。