COM组件常用接口,以备自用

来源:互联网 发布:rayfile for mac下载 编辑:程序博客网 时间:2024/05/29 12:39
COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。


COM组件的存在方式:DLL文件或者EXE文件;
COM组件包括COM对象;
COM对象包括COM接口;
COM对象之间通信方式COM接口;
COM接口为一组函数的集合;
GUID:全局唯一标识符,类似的ID有,CLSID,IID,根据用途不同进行的命名。


typedef struct GUID
{
DWORD data1;//0x12345678
WORD data2;//0x1234
WORD data3;//0x5678
BYTE data4[8];//0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88
}GUID




一、初始化函数:
1.CoBuildVersion 获取COM库的版本号。COM库也是在不断升级,这样会出现不同的版本号,当客户程序想要获取COM库的新功能和性能时必须要进行版本检查,版本号分为主版本号和次版本号,主版本号放在返回值的高16位,次版本放在低16位。一般只要比较主版本号就可以了。
2.CoInitialize COM库的初始化。COM库只有初始化后才可以使用,CoInitialize有一个参数,一个IMalloc的内存接口器,用于COM库内存的分配管理工作,如果CoInitialize参数指定为NULL,则由系统提供默认的管理器。CoInitialize返回值三种:S_OK 初始化成功,S_FALSE COM库已经在线程中初始化了,RPC_E_CHANGE_MODE 初始化失败。
3.CoUninitialize COM库功能服务终止。当调用CoUninitialize时,CoUninitialize所在的DLL也将终止服务退出内存。CoInitialize与CoUninitialize配套使用。
4.CoFreeUnusedLibraries 自动释放不再使用的DLL。注意,当调用CoFreeUnusedLibraries时,所调用的DLL并不是立即就退出的,而是要有一定的延迟。这是因为当有多个线程运行时,线程之间会因争夺资源而产生一线程的暂停,CoFreeUnusedLibraries会误以为这是不再使用的线程,所以会去释放它,而实际上它只是暂停而已。所以CoFreeUnusedLibraries一般会有十分钟的延迟时间。解决方法就是在代码里设置一个定时器,定时有调用CoFreeUnusedLibraries。


二、跟GUID有关的函数:
1.IsEqualGUID/IsEqualIID/IsEqulaCLSID 三个函数是分别判断两个GUID/IID/CLSID是否相等。
2.CLSIDFromProgID 根据ProgID的值在注册表里找到对应的CLSID的值,ProgID是为了方便记忆CLSID而取一个字符串名字。
3.StringFromCLSID 把CLSID的结果形式转换成字符串的形式。

4.ProgIDFromCLSID 由CLSID得到ProgID,使用完后要释放ProgID内存。

5.CoCreateGUID 随机生成一个GUID。


三、对象创建函数:
1.CoGetClassObject 获取对象的类厂。
2.CoCreateInstance 创建COM对象。CoCreateInstance其实是对COM对象创建过程的封装。其实过程是这样的:a.客户程序调用CoCreateInstance函数 b.CoCreateInstance函数调用CoGetClassObject函数 c.客户程序调用CoInitialize初始化COM库,COM库开始运行。 d.COM库找到组件程序DLL,并进入它。 e.在组建DLL里调用DLLGetClassObject函数。 f.CoGetClassObject函数把类长指针返回给CoCreateInstance函数,然后它调用类长对象创建函数。 g.类厂创建COM对象。 h.类厂把COM对象返回给CoCreateInstance函数,CoCreateInstance函数返回。i.客户程序直接调用COM对象。
3.CoCreateInstanceEx 创建COM对象,可指定多个接口或远程对象,这是为了避免客户程序与COM组件的频繁交互。这个函数用于组件外调用。
4.CoRegisterClassObject 注册一个类厂接口,类厂接口是组建程序一启动就创建好了的,无论客户程序是否调用。
5.CoRevokeClassObject 与CoRegisterClassObject配套使用。
6.CoDisconnectObject 断开其他应用程序与对象的连接。


四、内存管理函数:
1.CoTaskMemAlloc 内存分配函数。当客户程序调用COM组件的一个功能接口时,如果这个接口函数的参数有[out] 的参数,并且这个参数不是整形或浮点型时就要调用这个函数来申请一块内存。
2.CoTaskMemRealloc 重新分配内存。
3.CoTaskMemFree 与CoTaskMemAlloc 函数配套使用。
4.CoGetMalloc  获取COM库的内存管理器接口。
1 0
原创粉丝点击