COM技术纵横之谈二(初学者)

来源:互联网 发布:知乎和豆瓣的区别 编辑:程序博客网 时间:2024/05/01 20:28

COM纵横谈之二



组件中分配了一块内存,然后建起通过一个参数(可能是一个返回的指
针)传递给了客户,这是一种非常常见的做法。问题是:谁来释放这块
内存?这主要是由于组建和客户可能是有不同的程序员实现的,他们之
间没有办法建立一种分配和释放内存的标准办法。COM解决中各问题的办
法是提供一个接口(IMalloc),它可以有CoGetMalloc返回。为了分配
内存,只需要调用IMalloc::Alloc,而调用改函数所分配的内存可以有
IMalloc::Free负责释放。为了更加简单的实现,COM库提供了两个更加
简单的函数:
void
CoTaskMemAlloc(ULONG cb
/* size in bytes of block to be allocated */);

void CoTaskMemFree(void* pv);
如果你认真看了我的文章,到现在为止你大体上已经有了一个概念:
COM究竟是一种什么概念,它在哪些程度上需要程序员来实现,哪些则是
由操作系统所提供的COM库完成的。不十分严格的说,COM的目的是把各
种各样的函数分类,然后封装成一个个物件,这些物件在windows系统中
以DLL或者EXE的形式具体存在,并且通过注册表,window随时随地可以
知道某个特定组件的代码是在那个对应得DLL或者EXE里。这里提一下,
怎么告诉windows你需要哪个组件呢?我们使用GUID,其复杂的算法保证
了世界上没有两个个接口的ID标示号码是完全一样的!从而可以唯一的
确定组件,包括内含的接口,在客户需要该组件的时候windows也就可以
正确的装载它了。同样也是因为这个唯一性,客户在任何时候都可以直
截了当的,明确无误的询问windows,我要的就是这个组件里的这个接
口!告诉我你有吗?这时候,通过一个CoCreateInstance函数,windows
将返回接口指针,或者干脆的告诉你,没有找到!
那么,windows内部在执行这个函数的时候具体做了些什么呢?首先它
查询了注册表,找寻你所要的组件(组件也就是接口集,而所谓接口也
就是一组函数所组成的集合的代名词,这么说你明白了吗?)如果没有
找到该组件,查询自然失败,函数返回,如果找到了,那么进一步的,
内核将向windows返回该组件的IUnknown*指针,windows随后利用
IUnknown::QueryInterface函数查询你所指定的那个接口是不是被该组件
所实现(或者说支持)说到这里你一定可以发现,凡是接口,一般来说总
是要由你的代码去实现,IUnknown这个所有COM组件都必须实现的接口,
其目的之一就是让Windows知道如何查询你的组件。直到组件里实现了哪
些接口的只有你自己--写这个组件的人,所以你有责任妥当的好好些
QueryInterface函数以便返回正确的指针,windows随后将该指针转给
CoCreateInstance的调用处,整件事情也就结束了。现在你了解了吗?
写到这里,不知不觉的已经过了一个星期,不知道有没有朋友看了拙
文之后有质疑?我学习COM的时间也不长,欢迎大家一起来讨论!
明天打算讨论类厂,欢迎感兴趣的朋友继续关注!
(全文完)