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的时间也不长,欢迎大家一起来讨论! 明天打算讨论类厂,欢迎感兴趣的朋友继续关注! (全文完)