01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
2009-10-26 Mon
■ インターフェース [D言語]
phobosでのCoCreateInstanceの定義
HRESULT CoCreateInstance(const(CLSID) *rclsid, IUnknown UnkOuter,
DWORD dwClsContext, const(IID)* riid, void* ppv);
win32.objbase.dでのCoCreateInstanceの定義
HRESULT CoCreateInstance(REFCLSID, LPUNKNOWN, DWORD, REFIID, PVOID*);
最後の引数の型が違う
phobosでは
IUnknown iu;
CoCreateInstance(... ,&iu);
win32.objbase.dでは
IUnknown iu;
CoCreateInstance(... ,cast(void**)&iu); //キャストして大丈夫?
インターフェイス
インターフェイスは vtbl[] へのポインタです。
vtbl[0] は、object.Interface
クラスの対応するインスタンスへのポインタです。
残りのエントリ vtbl[1..$] は、
そのインターフェイスで実装される仮想関数へのポインタが、
宣言された順番に入ります。
COM インターフェイスは、通常のインターフェイスと異なり、
vtbl[0] に object.Interface は入りません。
vtbl[0..$] のエントリ全てが仮想関数ポインタで、
宣言された順番に格納されます。
これは Windows の COM オブジェクトのレイアウトに合わせています。
C++ インターフェイスは通常のインターフェイスと異なり、
ターゲット環境での C++
の単一継承のクラスレイアウトと同じ形式に合わせた実装になります。
インターフェイスは vtbl[] へのポインタだからvoid** にキャストしても大丈夫なのか。