2011-12-10 4 views
5

Essential COMを読んでいて、本の第2章のマクロ「BASE_OFFSET」が見つかりましたが、構文がわからない、またはその理由が分かりません。Essential COMのBASE_OFFSETマクロ

#define BASE_OFFSET(ClassName, BaseName) \ 
(DWORD_PTR(static_cast<BaseName*>(reinterpret_cast<ClassName*>(0x10000000))) - 0x10000000) 

誰でもこのマクロを説明し、これをどのように使用できますか?実際、この本はこのマクロを使っていますが、私はそれを実際に理解していないので、実際の使用法はわかりません。事前にどうもありがとうございました。

+0

私の質問を編集していただきありがとうございます。 – istudy0

+1

ちなみに、別の標準のWindowsマクロ[FIELD_OFFSET](http://msdn.microsoft.com/en-us/library/windows/hardware/ff545727(v=vs.85).aspx)は、名前付きフィールドのオフセットを取得しますの構造。あなたのコメントのために – Oleg

+0

ありがとうございます。 – istudy0

答えて

7

マクロは、reinterpret_castを持つClassNameのダミーポインタを作成し、を使用してBaseNameにキャストします。

複数の継承がある場合、基本クラスのサブオブジェクトのアドレスは、オブジェクトのアドレスと必ずしも同じではありません。この可能性の異なるアドレスは、ClassNameオブジェクト内のBaseNameサブオブジェクトのオフセットを得るために、元のダミー・アドレスから減算されます。これはoffsetofに似ていますが、メンバーではなく基本クラスのサブオブジェクトです。

Diagram showing an example

あなたはいくつかの厄介な低レベルのものをやっている場合にのみ有効です。

+0

ありがとうございます。あなたのダイアグラムは何が起こっているかを視覚化するのに役立ちます。 – istudy0

+0

+1、これも同様のものです:http://stackoverflow.com/q/5014061/57428 – sharptooth

関連する問題