COM原理
+ -

COM库的内存管理

2022-02-08 37 0

由于COM组件程序和客户程序是通过二进制级标准建立连接的,所以在COM应用程序中凡涉及客户、COM库和组件三者之间内存交互(分配和释放不在同一个模块中)的操作必须使用一致的内存管理器。

COM提供的内存管理标准,实际上是一个IMalloc接口:IID_IMalloc ={00000002-0000-0000-C000-000000000046}

class IMalloc:public IUnknown
{
    void * Alloc(ULONG cb)= 0;
    void * Realloc(void *pv,ULONG cb)= 0;
    void Free(void *pv)= 0;
    ULONG GetSize(void *pv)= 0;        //返回分配的内存大小
    int DidAlloc(void *pv)= 0;        //确定内存指针是否由该内存管理器分配
    void HeapMinimize()= 0;            //使堆内存尽可能减少,把没用到的内存还给操作系统,用于性能优化
}

获得IMalloc接口指针:

HRESULT CoGetMalloc(DWORD dwMemContext,IMalloc **ppMalloc);

CoGetMalloc的第一个参数dwMemContext用于指定内存管理器的类型。
COM库中包含两种内存管理器:

  • 一种就是在初始化时指定的内存管理器或其内部缺省的管理器,也称为作业管理器(task allocator),这种管理器在本进程内有效,要获取该管理器,应指定dwMemContext=MEMCTX_TASK;
  • 另一种是跨进程的共享分配器,由OLE系统提供,要获取这种管理器,应指定dwMemContext=MEMCTX_SHARED,使用共享管理器的便利是,可在一个进程内分配内存并传给第二个进程,在第二个进程内使用此内存甚至释放掉此内存。

只要返回值为S_OK,则ppMalloc就指向了COM库的内存管理器接口指针,可使用它进行内存操作,使用完毕后,应调用Release成员函数释放控制权。

COM库还封装了三个API函数,可用于内存分配和释放:

void * CoTaskMemAlloc(ULONG cb);
void CoTaskFree(void *pv);
void CoTaskMemRealloc(void *pv,ULONG cb);

这三个函数分配对应于IMalloc的三个成员函数:Alloc、Realloc 和 Free。

0 篇笔记 写笔记

COM库的内存管理
由于COM组件程序和客户程序是通过二进制级标准建立连接的,所以在COM应用程序中凡涉及客户、COM库和组件三者之间内存交互(分配和释放不在同一个模块中)的操作必须使用一致的内存管理器。COM提供的内存管理标准,实际上是一个IMalloc接口:IID_IMalloc ={00000002-0000-......
COM 内存分配和释放
于动态内存的申请和释放,一定要遵守“谁申请,谁释放”的原则。为解决这个问题,COM函数内部根据实际需要动态申请内存,而调用者负责释放。虽违背了上述原则,但COM从方便性和效率出发,确实是这么设计的。C语言C++语言Win32平台COMIMalloc接口BSTR申请m......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!