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()分配和回收。
- COM 组件内存分配和共享应用
- Com组件的内存分配和释放,CredentialProvider SHStrDup 字符串拷贝问题
- 进程的内存分配函数之brk和mmap(不考虑共享内存)的应用
- 驱动和应用共享内存
- .Net组件和COM+的应用
- COM组件设计和应用知识总结
- DLL内存分配与共享
- 进程分配内存的两种方式--brk() 和mmap()(不设计共享内存)
- COM组件设计与应用2 - GUID 和 接口
- COM组件设计与应用(二)GUID 和 接口
- COM组件设计与应用2 - GUID 和 接口
- COM组件设计与应用(二)---GUID 和 接口
- COM组件设计与应用——事件和通知
- COM组件设计与应用(二)--GUID 和 接口
- COM组件设计与应用(二)GUID 和 接口
- COM组件设计与应用(二)GUID 和 接口
- GUID 和 接口-COM组件设计与应用(二)
- COM组件设计与应用(二) GUID 和 接口
- 分别在Linux和Android中用C语言写系统日志
- Linux Shell 下的输出重定向
- 利用DYCOM快速建立wcf服务器端
- Android shell命令大全
- PHP获取传递进来的参数
- COM 组件内存分配和共享应用
- insertAdjacentElement方法在firefox中报错
- div+css+javascript图片切换(淡入浅出效果)
- CentOS更改时区
- java 双重检查锁定及单例模式
- Paxos算法1-算法形成理论
- php0跟false使用==有时相等必须用===
- SQL优化一点心得
- 基于linked server的scorm课件播放器数据同步从sqlserver->oracle