关于IMalloc和Mashaling

ecore2Aftron 2003-10-21 10:20:39
我不明白的是,假设我在进程外组件和客户之间传递一个out型的指向一块内存区的指针.那么我是否可以在服务器方用CoTaskMemAlloc分配内存,然后直接传递给客户,而不用使用比如size_is这样的属性来说明内存(数组)的大小.此外,是否用了size_is等这样的属性来良好的支持正确的mashaling,我是否又是可以不用CoTaskMemAlloc来分配内存呢?而是直接new(服务器方)和delete(客户方).
...全文
117 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lop5712 2003-10-22
  • 打赏
  • 举报
回复
对于out参数,正如楼主所说,必须CoTaskMemAlloc和CoTaskMemFree

当跨进程时,服务器端的占位(stub)发送一个标志,告知客户端的代理(proxy)分配一块内存,然后将stub传过来的数据考到那块内存中,stub删除由服务器通过CoTaskMemAlloc分配的内存,proxy将它分配的内存的指针传给客户,当客户端调用CoTaskMemFree释放内存时,其实释放的是proxy分配的内存(不是服务器分配的内存)

因此,必须使用CoTaskMemAlloc和CoTaskMemFree,否则就无法实现上面的机制了
zyong310 2003-10-22
  • 打赏
  • 举报
回复
在COM中客户和服务器共同管理内存,所以最好是使用IMalloc来处理,但是如果服务器对象仅仅申请自己内部用的内存,那就无所谓,只要内部匹配就可以了,比如用了new就要用delete,用来malloc就用free。传递CoTaskMemAlloc申请的内存的时候必须指定size,否则不能正确列集。
ecore2Aftron 2003-10-22
  • 打赏
  • 举报
回复
我所描述的自然是:一个out参数;
在服务器方分配内存,在客房释放内存.
所以,典型的就是服务器用CoTaskMemAlloc,然后传递,然后客户用CoTaskMemFree.
是这样的么?

可是,现在服务器和客户不在一个进程.我所知道的,IMalloc的实现机制实际上就是在进程的私有堆上.所以,其可以满足在进程内跨堆的分配.但现在跨进程了啊.......
这个机制还能使用么?
也许,列集的工作会自动把这些处理好吧.

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧