请教DCOM内存分配的问题

laughsky 2002-01-23 01:57:17
我有如下一个方法:
STDMETHOD(ReadGroupList)(/*[in]*/ULONG clientToken, /*[in]*/UINT cMax, /*[out,max_is(cMax)]*/GroupInfo *pGroupInfo);

GroupInfo是我自己定义的结构,现在客户端调用该方法,对于pGroupInfo来说,该在哪边分配内存,调用什么函数?按照书上应该在服务端分配,客户端释放,但是具体方法却不值如何实现,向大家请教
...全文
98 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
KnowLittle 2002-02-07
  • 打赏
  • 举报
回复
我来up
laughsky 2002-02-07
  • 打赏
  • 举报
回复
谢谢大家,问题已经解决。的确像freezer(自由不要钱)兄说得那样,如果传递数组时不使用安全数组(SAFEARRAY)的话,CS在同一进程中是没有问题的,但如果注册成NT SERVER,则会出现内存分配错误。如果不是数组的话,使用自定义的结构类型是没有问题的,但由会出现警告信息
"warning MIDL2039 : interface does not conform to [oleautomation] attribute :..."
使用SAFEARRAY后的方法如下定义:
HRESULT ReadGroupListEx([in]ULONG clientToken, [in]UINT uiLen, [out, retval]SAFEARRAY(GroupInfo) *pSa);
而实现函数如下定义:
STDMETHOD(ReadGroupListEx)(/*[in]*/ULONG clientToken, /*[in]*/UINT uiLen, /*[out,retval]*/SAFEARRAY **pSa);// 这句是手工加上的

至于SAFEARRAY的使用我就不在这里画蛇添足了。
============================
明天就放假了,祝大家“马”到成功 :)
luo_wen_jie 2002-02-01
  • 打赏
  • 举报
回复
在服务端分配,客户端释放只适用于客户端和服务端在同一进程的情况。对于EXE服务器和远程计算机上的服务器(即DCOM)则客户端的函数调用被代理对象列集后通过RPC传到服务器进程中的存根对象,存根对象散集后调用实际对象的接口函数,返回的结果被存根对象列集后通过RPC传到客户端的代理对象,再由代理对象散集后返回给客户程序。因此,函数返回的结构的实际内容将被存根对象传给代理对象,代理对象根据结构的实际内容在客户进程内分配内存并把指针返回给客户程序,客户程序可以安全的释放该内存,服务端分配的内存在存根对象列集后由存根对象释放。代理对象和存根对象一般由开发工具自动生成,详细情况可参考潘爱民的《COM原理与应用》第四章第二节。
turbopeng 2002-01-31
  • 打赏
  • 举报
回复
MM
visiond 2002-01-27
  • 打赏
  • 举报
回复
关注
laughsky 2002-01-25
  • 打赏
  • 举报
回复
upup
freezer 2002-01-24
  • 打赏
  • 举报
回复
双接口是提供自动化对象时用的,它同时实现IDispatch和vtable.
能够传递给调度接口或双接口的参数类型是有限的,并不包含自定义的结构(你可以去看一下介绍COM的书籍),也许在进程内的com调用中不会出现问题,因为进程内调用是知道内存空间是如何分配的,但是在跨进程的DCOM中就会有问题。
laughsky 2002-01-24
  • 打赏
  • 举报
回复
Poincare兄,对于[out]型的数组参数似乎应该是服务器端分配内存,客户端释放,而[in]型的与之相反。

freezer兄,谢谢你的提醒,不过我看到下面一段话:
“通过VARIANT,VT_RECORD,IRecordInfo的这种方法可以用自动化来传递自定义类型
数据,但实际上这种方法只适用于双接口的情况。其原因在于实现组件IDispatch
接口的IDispatchImpl类身上,它是通过VTable来调用方法的。如果是纯Dispatch
接口就不能用这种方法,而我经过试验,暂时无法用这种方法实现dispinterface
的情况。”
我对双接口的定义还不太清楚,如果你知道就向我解释解释。还有,为什么说在DCOM中用自定义结构不安全?
freezer 2002-01-24
  • 打赏
  • 举报
回复
如果是DCOM,这样做可能不太安全,最好在接口中定义成VARIANT变量,然后在服务器端给pGroupInfo分配空间,并且将其转化成VARIANT类型传出,在客户端反过来将VARIANT转化成GroupInfo类型,这里也要给GroupInfo分配空间,用完以后释放
Poincare 2002-01-23
  • 打赏
  • 举报
回复
按照书上应该在客户端分配
Essential COM (COM 本质论)

3,245

社区成员

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

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