COM 和 OLE 的关系非常类似于微积分和物理的关系.
COM 是用来解决诸如如何将一个电子表格嵌入到字处理程序之类的问题. 此类问题的解决方案正是OLE.
运行时动态链接(动态改变组件) + 信息封装
一种开发与语言无关的组件库的方法.
DLL 的接口是它所输出的那些函数.
C++类的接口则是该类的一个成员函数集。
COM接口是一个包含一个函数指针数组的内存结构。
COM接口在C++中是用纯抽象基类实现的。
可以提供多个接口, 组件用类来实现,实现接口的所有成员。
__stdcall 标准调用约定, 函数将在返回到调用者之前将参数从栈中删除, 也就是Pascal调用。VB . All COM interface use __stdcall.
__cdecl 常规C/C++调用约定, 栈的清理工作由调用者完成.带变参函数.
定义一个纯抽象基类就是定义了相应的内存结构.但此结构只是在派生类中实现此抽象基类时才会被分配.派生类继承一个抽象基类时, 它将继承此内存结构.
不同实例共享同一 vtbl, 其中的元素指向虚拟成员函数的同一实现。各对象有不同的实例数据。 < 指向接口的指针指向vtbl>
interface
IUnknown
{
virtual HRESULT _stdcall QueryInterface(const IID& iid, void** ppv) =0;
virtual ULONG _stdcall AddRef() = 0;
virtual ULONG _stdcall Release() = 0;
}

IUnknow
*
pI ...
IX
*
pIX
=
NULL;
HRESULT hr
=
pI
->
QueryInterface(IID_IX,(
void
**
)
&
pIX);
if
(SUCCEEDED(hr))
pIX
->
DoSomthing();

非虚拟方式继承IUnknown(
?
)

HRESULT _stdcall QueryInterface(cosnt IID
&
iid,
void
**
ppv)
{
if (iid == IID_IUnknown)
*ppv = static_cast<IX*>(this); // Not IUnknown*, multi-inheritance
else if(iid == IID_IX)
*ppv = static_cast<IX*>(this);
else if (iid == IID_IY)
*ppy = static_cast<IY*>(this);
else
{
*ppv = null; return E_NONINTERFACE;}

static_cast<IUnknow*>(*ppv)->AddRef();
return S_OK;
}
继承两个接口将有两个对应的vtbl指针.
1. Initialize pointer pIX = NULL is encouraged.
2. Code Sample:
COM 是用来解决诸如如何将一个电子表格嵌入到字处理程序之类的问题. 此类问题的解决方案正是OLE.
运行时动态链接(动态改变组件) + 信息封装
一种开发与语言无关的组件库的方法.
DLL 的接口是它所输出的那些函数.
C++类的接口则是该类的一个成员函数集。
COM接口是一个包含一个函数指针数组的内存结构。
COM接口在C++中是用纯抽象基类实现的。
可以提供多个接口, 组件用类来实现,实现接口的所有成员。
__stdcall 标准调用约定, 函数将在返回到调用者之前将参数从栈中删除, 也就是Pascal调用。VB . All COM interface use __stdcall.
__cdecl 常规C/C++调用约定, 栈的清理工作由调用者完成.带变参函数.
定义一个纯抽象基类就是定义了相应的内存结构.但此结构只是在派生类中实现此抽象基类时才会被分配.派生类继承一个抽象基类时, 它将继承此内存结构.
不同实例共享同一 vtbl, 其中的元素指向虚拟成员函数的同一实现。各对象有不同的实例数据。 < 指向接口的指针指向vtbl>






























继承两个接口将有两个对应的vtbl指针.
1. Initialize pointer pIX = NULL is encouraged.
2. Code Sample:
