我已经使用 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,每种方法都有两个版本 - 一个“原始”版本和一个带有更友好的包装隐藏的版本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;
}
}
现在我们来谈谈我无法理解的东西:两个基本公开相同功能但不同的附加类。
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 类型的对象,我似乎有四个不同的类来表示它——我应该使用哪一个,什么时候使用?
IFooPtr f;
IFooDisp f;
TCOMIFoo f;
TFoo *f;
最后,因为IFooDisp f;
似乎我可以Bar()
通过任何一个调用f->Bar()
-f.Bar()
它们会以相同的方式工作,还是有一些细微的区别?