COM学习笔记一《用VC进行COM编程所必须掌握的理论知识》

  1   要用COM

OO vs. COM —— 重用的方法不同
1 类库 —— 类库 的重用基于源 的方式
限制了
次都必 重新 编译
2 DLL ——
函数重名 问题
编译 C ++函数的名称修 不兼容 问题 (也可以用 extern "C" ;来 强调 使用 准的 C 函数特性, 关闭 功能,但 这样 失了 C ++的重 性功能)
路径 问题
④ DLL EXE 的依 赖问题
2     COM 实际 上是一个 C++ ,而接口都是 件从接口派生而来。 COM 件是以 C++ 的,特 重要的是虚函数和多 的概念, COM 中所有函数都是虚函数,都必 虚函数表 VTable 用。
3     COM 件有三个最基本的接口 ,分 IUnknown IClassFactory IDispatch
COM 定任何 件、任何接口都必 IUnknown 承, IUnknown 包含三个函数,分 QueryInterface AddRef Release 三个函数是无比重要的,而且它 的排列 序也是不可改 的。
IClassFactory 的作用是 COM 件。 件都必 有一个与之相 厂, 厂知道怎 么样创 件,当客 户请 求一个 象的 实际 求交 厂,由 例,然后把 例指 程序。 IClassFactory 最重要的一个函数就是 CreateInstance 名思 就是 例。
IDispatch 叫做 度接口。 度接口把 一个函数 一个属性都 上号,客 程序要 些函数属性的 侯就把 传给 IDispatch 接口就行了, IDispatch 再根据 用相 的函数, 此而已。
4     COM 件有三 程内、本地、 程。 于后两者情况必 须调 度接口指 及函数参数。
5     COM 件的核心是 IDL
6     COM 件的运行机制

IUnknown *pUnk=NULL;
IObject *pObject=NULL;
CoInitialize(NULL);
CoCreateInstance(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IUnknown, (void**)&pUnk);
pUnk->QueryInterface(IID_IOjbect, (void**)&pObject);
pUnk->Release();
pObject->Func();
pObject->Release();
CoUninitialize();

就是一个典型的 COM 件的框架,不 我的 趣在 CoCreateInstance 身上, 来看看它内部做了一些什 事情。以下是它内部 实现 的一个

CoCreateInstance(....)
{
.......
IClassFactory *pClassFactory=NULL;
CoGetClassObject(CLSID_Object, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void **)&pClassFactory);
pClassFactory->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk);
pClassFactory->Release();
........
}

的意思就是先得到 象,再通 过类 件从而得到 IUnknown 继续 深入一 ,看看 CoGetClassObject 的内部 伪码

CoGetClassObject(.....)
{
// 过查 注册表 CLSID_Object ,得知 DLL 的位置、文件名
//
装入 DLL
//
使用函数 GetProcAddress(...) 得到 DLL 中函数 DllGetClassObject 的函数指
//
DllGetClassObject
}    

DllGetClassObject 是干什 的,它是用来 象的。只有先得到 厂才能去 . 下面是 DllGetClassObject 伪码

DllGetClassObject(...)
{
......
CFactory* pFactory= new CFactory; //

pFactory->QueryInterface(IID_IClassFactory, (void**)&pClassFactory);
//
查询 IClassFactory
pFactory->Release();
......
}

CoGetClassObject 的流程已 到此 止, 在返回 CoCreateInstance ,看看 CreateInstance 伪码

CFactory::CreateInstance(.....)
{
...........
    CObject *pObject = new CObject; //
    pObject->QueryInterface(IID_IUnknown, (void**)&pUnk);
    pObject->Release();
    ...........
}

7     注册表 问题
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值