c ++ Builder 2010(コンポーネント/コンポーネントのインポート/タイプライブラリウィザード)を使用してタイプライブラリをインポートし、生成されたxxx_TLB.bファイルとxxx_OCX.hファイルで定義されているクラスとタイプを理解しようとしています。(質問の背景-COMオブジェクトとメソッドをDISPIDではなく名前でバインドしようとしています-この質問を参照してください)
ライブラリにクラスFooが含まれているとすると、次のGUIDを取得します
const GUID IID_IFoo = {0xF1EC45FE, 0x2540, 0x4188,{ 0xAE, 0x14, 0xD8,0x4F, 0x65, 0x6F,0x7A, 0x00} };
const GUID CLSID_Foo = {0xDD1C416D, 0xD8A2, 0x4BBC,{ 0x8E, 0xA8, 0x1A,0x10, 0x77, 0xA4,0x30, 0x0C} };
それは私には理にかなっています。FooEventsも生成されますが、今は無視します。また、次のインターフェイスとtypedefを取得し、各メソッドの2つのバージョンを使用します。「raw」バージョンと、よりわかりやすいラッパーを非表示にするバージョンですHRESULTS
。
interface DECLSPEC_UUID("{F1EC45FE-2540-4188-AE14-D84F656F7A00}") IFoo;
typedef TComInterface<IFoo, &IID_IFoo> IFooPtr;
interface IFoo : public IDispatch
{
virtual HRESULT STDMETHODCALLTYPE get_Bar(BSTR* Value/*[out,retval]*/) = 0; // [201]
...
BSTR __fastcall get_Bar(void)
{
BSTR Value = 0;
OLECHECK(this->get_Bar((BSTR*)&Value));
return Value;
}
}
ここで、私を超えたものに行き着きます。基本的に同じ機能を公開しているが、異なる2つの追加クラスです。
template <class T /* IFoo*/ >
class TCOMIFooT : public TComInterface<IFoo>, public TComInterfaceBase<IUnknown>
{
... again, two versions of each method are provided.
}
typedef TCOMIFooT<IFoo> TCOMIFoo;
template<class T>
class IFooDispT : public TAutoDriver<IFoo>
{
... again, two more versions of each method are provided.
}
typedef IFooDispT<IFoo> IFooDisp;
そしてそれはさらに悪化します:xxx_OCX.hファイルでこの追加のクラスを見つけます:-
class PACKAGE TFoo : public Oleserver::TOleServer
{
IFooPtr m_DefaultIntf;
_di_IUnknown __fastcall GetDunk();
public:
... this tim, just one version of each method
}
したがって、タイプFooのオブジェクトの場合、それを表すために4つの異なるクラスがあるようです。どのクラスをいつ使用する必要がありますか?
IFooPtr f;
IFooDisp f;
TCOMIFoo f;
TFoo *f;
そして最後に、私はどちらかを介してIFooDisp f;
呼び出すことができるようです-それらは同じように機能しますか、それとも微妙な違いがありますか?Bar()
f->Bar()
f.Bar()