在上一个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()分配和回收。