COM 组件内存分配和共享应用

来源:互联网 发布:java反序列化 time 编辑:程序博客网 时间:2024/05/18 01:09

在上一个blog中说明了如何实现size_is的应用,在这个blog中主要用来说明如果通过[out, size_is]讲COM组件或者server中的数据Output给caller。实例如下:

IDL interface define:

HRESULT  TestInterface2([out] long  * size, [out, size_is( , *size)] byte ** data);

 

COM services code:

STDMETHOD  (TestInterface2)(/*[out]*/ long  *size, /*[out, size_is( , *size)]*/ byte ** data)
 {
  LPBYTE p = NULL;
  *size = 11;
  long   dSize = *size;
  *data = (LPBYTE)CoTaskMemAlloc(dSize * sizeof(unsigned char));

  memset(*data, 0, dSize);
  memcpy(*dat, "123456789a", 10);

  
  return S_OK;
 };

 

COM Client code:

long lSize = 0;

byte * pData = NULL;

m_pInterface->TestInterface2(&lSize, &pData);

CoTastMemFree(pData);

 

说明:COM组件内存分配和共享是通过CoTaskMemAlloc函数实现的,并且需要调用CoTastMemFree API函数释放内存。这是COM组件内存共享的唯一途径,关于原理我目前只知道是“the cotaskmemalloc function has the advantage of 
working well in either c, c++, or visual basic. it is also 
the only way to share memory in a com-based 
application, since midl uses cotaskmemalloc 
and cotaskmemfree to marshal memory.”,还需要做进一步研究。

特别说明:BSTR类型数据不需要通过CoTaskMemAlloc实现内存分配,它需要通过SysAllocString()和SysFreeString()分配和回收。