/ / メモ
2009-10-26

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); //キャストして大丈夫?

ABI - プログラミング言語 D 2.0

インターフェイス
インターフェイスは vtbl[] へのポインタです。
vtbl[0] は、object.Interface
クラスの対応するインスタンスへのポインタです。
残りのエントリ vtbl[1..$] は、
そのインターフェイスで実装される仮想関数へのポインタが、
宣言された順番に入ります。
COM インターフェイスは、通常のインターフェイスと異なり、
vtbl[0] に object.Interface は入りません。
vtbl[0..$] のエントリ全てが仮想関数ポインタで、
宣言された順番に格納されます。
これは Windows の COM オブジェクトのレイアウトに合わせています。
C++ インターフェイスは通常のインターフェイスと異なり、
ターゲット環境での C++
の単一継承のクラスレイアウトと同じ形式に合わせた実装になります。

インターフェイスは vtbl[] へのポインタだからvoid** にキャストしても大丈夫なのか。

トラックバック http://mikanya.dip.jp/memo/2009-10-26-1