com组件、对象、接口

爷,独闯天下 提交于 2019-12-07 09:49:28

1、com(component object model)组件对象模型。
特点:语言无关、可以重用
应用:DirectX、OLE DB、ADO
OLE是com的应用。
2、这里写图片描述
一个com组件包括多个com对象,一个com对象实现多个接口。
3、com对象类似于c++中的类,包含属性和方法。在c++中,可以用类来定义com对象。
com组件对客户来说是透明的。
GUID用于标识com组件。
com接口:二进制特性,每个接口必须从IUnknown继承而来。
4、 IUnknown的定义:
interface IUnknown
{
HRESULT QueryInterface(
[in] REFIID iid,
[out] void **ppv);
ULONG AddRef();
ULONG Release();
}
输入参数iid为接口标识符:IID。
输出参数ppv为查询得到的结果接口指针。
IUnknown包含三个函数,分别是 QueryInterface、AddRef、Release。这三个函数是无比重要的,而且它们的排列顺序也是不可改变的。
QueryInetrface:查询com对象的其他接口指针
AddRef和Release用于对引用计数进行操作。
引用计数:每个com对象都记录 一个“引用计数“的数值,该数值记录了有多少个指针在使用com对象。用户得到指向该对象的接口的指针后,引用计数加一,用完后引用计数减一。减到0时,com对象就在内存中清除。
AddRef、Release分别用于引用计数加一减一操作。
HRESULT QueryInterface(
[in] REFIID iid,
[out] void **ppv);
返回32位的整数,有三种情况:
(1)S_OK,查询到了指定接口,接口指针存放在ppv输出的参数中。
(2)E_NOINTERFACE,对象不支持指定接口,*ppv为NULL。
(3)E_UNEXPECTED,发生错误。
HRESULT类型是一个32位的整数。反映函数调用结果。
5、com对象和接口表示方法:
这里写图片描述
6、DLL动态库或exe程序可以看做是com在windows上的具体实现。
dll:包括函数引出表,有函数的名称、编号、地址。
dll导出函数的方式:
(1) 源代码中的 __declspec(dllexport)
(2).def 文件中的 EXPORTS 语句
dll的引出函数格式:
extern “c” long _stdcall MyFunction();
extern “c” int _stdcall MyFunction();
dll中的def文件用于描述dll程序的模块信息。
如 mylib.def:
; mylib.def : 声明 DLL 的模块参数。

LIBRARY

EXPORTS
; 此处可以是显式导出
DllCanUnloadNow PRIVATE
DllGetClassObject PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
com组件必须在系统注册表中注册后,才能被客户端调用。
客户端不直接调用引出函数,通过com库的API调用。
调用dll可按照如下步骤:
com客户端程序使用LoadLibrary函数装入dll,然后客户端调用GetProcAddress函数获得dll中引出函数的地址。当函数使用完后,如果不在使用dll程序,则调用FreeLibrary把dll程序卸出内存。
7、类厂:
com库通过类厂创建com对象。一个对象对应一个类厂。类厂是一个对象,有IClassFactory接口。
com库包含了com组件。使用com库时,先初始化。
com库常用函数:
初始化:
CoBuildVersion //获取com库版本
Coinitialize //com库初始化
CoUninitialize //com库功能服务终止

class IClassFactory:public IUnknwn
{
virtual HRESULT _stdcall CreateInstance(IUnknown *pUnknownOuter,const IID&iid,void **ppv)=0;//创建com对象
virtual HRESULT _stdcall LockServer(BOOL block)=0;
};
类厂由引出函数DllGetClassObject创建。
HRESULT DllGetClassObject(const CLSID& clsid,const IID& iid,(void*)ppv);
8、com开发:com sdk、MFC、ATL

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!