Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

CRuntimeClass の実装について

506 views
Skip to first unread message

ちゅ

unread,
Jan 7, 2010, 12:28:49 AM1/7/10
to
MFCでの質問です。

CObject::IsKindOf() の機能を自作クラスに取り入れたい為、
CRuntimeClass を見てやり方は分かったのですが、実装に付いて
疑問があります。

CRuntimeClass 内で 派生元のクラス名を取得するのに
#ifdef _AFXDLL
CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
CRuntimeClass* m_pBaseClass;
#endif
と 実装が異なっています。
拡張DLLの時だけ _GetBaseClass()/GetThisClass() 経由で
派生元と自クラスを取得しています。
この理由を推測できる方が居ましたら御教授お願いします。
--
ちゅ

UETA, Shin-ichi

unread,
Jan 7, 2010, 11:23:38 PM1/7/10
to
こんにちは、植田です。

ちゅ wrote:
> 拡張DLLの時だけ _GetBaseClass()/GetThisClass() 経由で
> 派生元と自クラスを取得しています。

_AFXDLLは、MFCを動的にリンク、つまりDLL版MFCを使うことを意味するので、
シンボルのインポート/エクスポートが絡んできます。

これ↓はちょっと古い情報みたいですけど、今でも通用するのではないかと。

PRB: Bad Pointer from RUNTIME_CLASS with Class from _AFXDLL
http://support.microsoft.com/kb/131946

つまり、MFCを動的にリンクする場合は、対象オブジェクトのCRuntimeClass
に直接アクセスできないので、アクセサ(_GetBaseClass/GetThisClass)を
介して取得するわけです。

まぁ、この辺りはMFCのバージョンによって微妙に実装が変わるかもしれない
ので、マクロなど、「お約束」に従ってコーディングし、あまり深入りしない方が
いいでしょうね。
通常はDECLARE_DYNAMIC/IMPLEMENT_DYNAMICマクロさえ仕込んでおけば、
あとはMFCが勝手に処理してくれると思いますけど...。

ランタイム クラス情報へのアクセス方法 (MFC)
http://msdn.microsoft.com/ja-jp/library/t91eb9y9%28VS.80%29.aspx


--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:ue...@usdesign.jp


ちゅ

unread,
Jan 11, 2010, 8:11:30 PM1/11/10
to
ちゅ です。

On Fri, 8 Jan 2010 13:23:38 +0900
"UETA, Shin-ichi" wrote
in message news:OMYIdpBk...@TK2MSFTNGP04.phx.gbl...
> Re: CRuntimeClass の実装について

有難う御座います。
CObject からの派生ではなく
自作のクラスなのでMFCのお約束のコーディングが出来ないのがつらいです。
RTTIは使いたくないので。(VC以外の古いコンパイラでも使用する為)


> PRB: Bad Pointer from RUNTIME_CLASS with Class from _AFXDLL
> http://support.microsoft.com/kb/131946

参考になりました。
自作のクラスなのでシンボルの定義は確実に行なっているのですが
いまいち確信がもてなくて質問しました。
クラスを使う人は簡単に実装してくれと言いますが、作る側は
色々な事を想定しないといけないので大変です。
myDECLARE_DYNAMIC / myIMPLEMENT_DYNAMICマクロ 作るのしんどいな…。

--
ちゅ

0 new messages