学习笔记 Real COM with the MFC Library (译三)
来源:互联网 发布:操作系统原理linux篇 编辑:程序博客网 时间:2024/06/05 16:04
COM客户程序是如何调用进程内组件的
我们用DLL组件代替EXE组件来开始这一节,因为这样程序的交互要简单点儿。我们将在这使用伪代码而非隐藏了太多细节的,将来会使用到的MFC类库。
Client
CLSID clsid;
IClassFactory* pClf;
IUnknown* pUnk;
CoInitialise(NULL);//Initialise COM
CLSIDFromProgID("componentname", &clsid);
COM
COM通过程序易读的"componentname"在注册表中寻找CLSID
Client
CoGetClassObject(clsid, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void**)&pclf);
COM
COM用CLSID在内存中寻找组件
if(组件还没有载入到内存){
COM从注册表中获得DLL的文件名
COM把DLL组件载入到内存进程中
}
DLL Component
if(如果组件被加载){
全局factory对象被构建
DLL的初始实例化被执行(仅仅对于MFC)
}
COM
COM调用DLL导出的全局方法DllGetClassObject,并把传递给CoGetClassObject的参数CLSID作为参数再传递给它
DLL Component
DllGetClassObject返回接口IClassFactory*
COM
COM把IClassFactory*返回给客户程序
Client
pClf->CreateInstance(NULL, IID_IUnknown, (void**)&pUnk);
DLL Component
class factory 的CreateInstance方法被调用(该操作直接通过组件的虚函数表调用)
开始构建"componentname"类对象
返回请求的接口指针
Client
pClf->Release();
pUnk->Release();
Dll Component
释放"componentname"是通过调用虚函数表进行的
if(引用计数 == 0){
对象自己将作销毁操作
}
Client
CoFreeUnusedLibraries();
COM
COM调用DLL导出的全局方法DllCanUnloadNow
DLL Component
DllCanUnloadNow被调用
if(所有的DLL对象已经被释放){
return TRUE
}
Client
CoUninitialize();//如果上面DllCanUnloadNow推出时返回TRUE,那么COM将释放DLL
COM
COM releases resources
Client
客户程序退出
DLL Component
如果DLL还在内存中并且没有其它程序在使用它,windows将卸载DLL
有几个重要的问题需要注意:第一,DllGetClassObject是为了响应客户程序调用CoGetClassObject才被执行的;第二,返回的class factory接口地址是DLL中的虚函数表内class factory的实际物理地址,第三,客户程序调用CreateInstance或其它所有接口方法都是直接调用的(通过组件的vtable)。
下一节:How a COM Client Calls an Out-of-Process Component
- 学习笔记 Real COM with the MFC Library (译三)
- 学习笔记 Real COM with the MFC Library (译一)
- 学习笔记 Real COM with the MFC Library (译二)
- 学习笔记 Real COM with the MFC Library (译四)
- MFC学习笔记三
- MFC学习笔记(三)
- Inside COM 学习笔记三
- COM学习笔记(三)
- COM学习笔记三--聚合
- COM学习笔记(三)
- the C standard library 学习笔记
- PBC library 学习笔记(三)
- VC++/MFC学习笔记(三)
- MFC学习笔记(三)
- C++ MFC学习笔记三
- MFC学习笔记(三)
- MFC学习笔记(三)
- RCNN学习笔记(3):《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》
- Sun Java Studio Enterprise 实践:创建一个 Web 应用程序
- 她答应我来上网!
- 我的第一篇blog
- 一次读取大Size Jpeg图的测试
- 我是你的谁?
- 学习笔记 Real COM with the MFC Library (译三)
- 译:Apache Maven-简化java的构建过程--比apache ant更多(2) 创建一个简单的maven项目
- VPN网络的组建(图解)
- 星际发展过程中发展出来的一些理论
- 轻松进入Linux的桌面应用开发.gambas初步认识.
- 怎样饮茶最健康?
- 昨日关注:VB vs. C# MSIL Code Generation: Are the results equal?
- 单元测试-理论篇
- 在小站上加了个最土的留言板,先就这样用用吧,做好的还需要找点资料