社区
ATL
帖子详情
请教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
打赏
收藏
请教DCOM内存分配的问题
我有如下一个方法: STDMETHOD(ReadGroupList)(/*[in]*/ULONG clientToken, /*[in]*/UINT cMax, /*[out,max_is(cMax)]*/GroupInfo *pGroupInfo); GroupInfo是我自己定义的结构,现在客户端调用该方法,对于pGroupInfo来说,该在哪边分配内存,调用什么函数?按照书上应该在服务端分配,客户端释放,但是具体方法却不值如何实现,向大家请教
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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 本质论)
JVM学习第二天(垃圾回收器和
内存
分配
策略)大章
说道垃圾回收器大家应该...为什么我们要了解GC和
内存
分配
: 1:面试;在面试的时候只要简历上写了了解或者精通JVM不用想,GC是必问的一个知识点; 2:GC对应用的性能是有影响的; 3:写代码有帮助; 谁需要GC: 就是共享的内...
jvm 调优
(-Xms可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新
分配
内存
。) 也就是目前mobilecashier jvm最大可用
内存
是3800m,年老代最大可用2300m(3800m-1500m),我们目前的机器是4C10g,于是问知言能否增加jvm...
Java基础知识的三十个经典问答
内存
处理器是编程人员容易出现
问题
的地方,忘记或者错误的
内存
回收导致程序或者系统的不稳定甚至崩溃,java的GC功能可以自动监测对象是否超过作用域从而达到自动回收
内存
的目的,java语言没有提供释放已
分配
内存
的俄...
Windows XP启动慢的
问题
今天打开电脑居然慢到死。主要现象就是,开机进到桌面以后,那个桌面不完全显示,那个本地连接、输入法那些都没启动...把全部的服务都逐个看简介并重新
分配
自动、手动、禁止。 基本试过。加searching解决了
问题
。 ...
电脑故障维修大全
[基本配置:] IBM品牌机,CPU2.53G,
内存
1G [故障描述:] 显示器点不亮,开机后进入主板画面反复重启,怀疑电源
问题
,更换电源无效,进入BIOS设置,发现CPU频率降到1.9G,仔细检查发现,CPU外频被人从133MHZ改为100MHZ...
ATL
3,245
社区成员
48,537
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章