文書番号: 402863
最終更新日: 2004/03/29
この資料は以下の製品について記述したものです。
- Microsoft(R) Visual C++(TM) Development System Standard Edition forWindows(R) Version 1.0
- Microsoft(R) Visual C++(TM) Development System Professional Edition forWindows(R) Version 1.0
- Microsoft(R) Visual C++(TM) Development System for Windows(R) Version 1.5(以下 Visual C++ 1.5)
概要
この資料は 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) において修正されています。
Keywords: KBBUG VC10 VC15 KB402863
Technology: kbAudDeveloper kbvc150 kbVCsearch