本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[MSVC] _USRDLL内でON_REGISTERED_MESSAGEを使うと一般保護違反

文書番号: 402863

最終更新日: 2004/03/29


この資料は以下の製品について記述したものです。


概要

この資料は Microsoft Foundation Class (以下 MFC) Version 2.0 の機能 _USRDLL を 利用し _USRDLL 内で ON_REGISTERED_MESSAGE を使うと一般保護違反が発生することに ついて説明したものです。

詳細

MFC を利用したアプリケーションにおいて、ON_REGITERED_MESSAGE は、
RegisterWindowMessage() 関数によって作られたメッセージを使用する時に
利用されますが、これを _USRDLL の DLL 内で、使用すると、一般保護違反が
発生します。

原因

WINCORE.CPP の 851 行で pMessageMap は以下のように定義されています。
    AFX_MSGMAP* pMessageMap;
ここで、AFXMSGMAP は NEAR の構造体です。それゆえ、pMessageMap も NEAR の
ポインタになります。 そして、WINCORE.CPP の 914 行目で_AFX_FP_SEG マクロを
使って、メッセージマップが登録されるセグメントを決めています。pMessageMap
は NEAR ポインタなので、_AFX_FP_SEG の戻り値は異常となります。

対処方法

DLL のコードから、ON_REGISTERED_MESSAGE() マクロを取り除き、WindowProc() を
オーバーライドします。そして、以下のように記述してください。
例:
   UINT nRegMessage; // RegisterWindowMessage() で登録されるメッセージ
   ...
   LRESULT CMyWnd::WindowProc(UINT message, WPARAM wParam,
      LPARAM lParam)
   {
      // もし、メッセージが登録されたメッセージなら
      // そのメッセージのハンドラを呼ぶ
      if (message == nRegMessage)
         return OnMyRegisteredMessage(wParam, lParam);
      // 他のメッセージは、WindowProc の基底クラスで処理する。
      CWnd::WindowProc(message, wParam, lParam);
   }
また、この問題は、Visual C++ 1.5 (MFC2.5) において修正されています。

詳細

  • Visual C++ は、米国 Microsoft Corporation の商標です。

Keywords: KBBUG VC10 VC15 KB402863
Technology: kbAudDeveloper kbvc150 kbVCsearch

inserted by FC2 system