社区
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来说,该在哪边分配内存,调用什么函数?按照书上应该在服务端分配,客户端释放,但是具体方法却不值如何实现,向大家请教
...全文
145
10
打赏
收藏
请教DCOM内存分配的问题
我有如下一个方法: STDMETHOD(ReadGroupList)(/*[in]*/ULONG clientToken, /*[in]*/UINT cMax, /*[out,max_is(cMax)]*/GroupInfo *pGroupInfo); GroupInfo是我自己定义的结构,现在客户端调用该方法,对于pGroupInfo来说,该在哪边分配内存,调用什么函数?按照书上应该在服务端分配,客户端释放,但是具体方法却不值如何实现,向大家请教
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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白,当然说道具体的可能就不是很清楚了,今天我们就来玩一玩; GC要做的事情: 第一步:确定堆中需要回收的对象; 第二步:什么时候回收; 第三步:怎样回收 为什么我们要了解GC和
内存分配
: 1:面试;在面试的时候只要简历上写了了解或者精通JVM不用想,GC是必问的一个知识点; 2:GC对应用的性能是有影响的; 3:写代码有帮助; 谁需要GC: 就是共享的内...
Java基础知识的三十个经典问答
先给大家复习一下基础题!!! Java基础是java初学者的起点,是帮助你从小白入门到精通必学基础课程! 为初学者而著! Java300集>>>适合准备入行开发的零基础员学习Java,基于最新JDK13、IDEA平台讲解的,视频中穿插多个实战项目。每一个知识点都讲解的通俗易懂,由浅入深。不仅适用于零基础的初学者,有经验的程序员也可做巩固学习。 配套学习:Java初学者入门教程>>> 1、面向对象的特点 抽象: 抽象是或略一个主题中与当前目标的无关的因
jvm 调优
Mobilecashier jvm参数调优cpu使用率降低20个点总结 mobilecashier gzone机房的机器CPU最近节节高升逼近70%以上,如下是mobilecashier-60-51在16号以后的CPU情况,最高已经达到87.95%,当时初步判断是新春红包业务(转账业务目前走gzone)上涨引起。 又想业务量比起大促还是少了点,这里面肯定不正常,随后看了gzone的其他
面试中的数据库
问题
如何应对面试中的数据库
问题
很多同学并不是数据库的专家,面试如果问到数据库并没有太多信心,面试数据库是有窍门的,因为数据库是一个庞大的系统,面试的时候没有办法考得很深,而且有一些题目是被反复问到的,大家可以提前准备。在这里我只提供答题思路,一来可以避免大家在面试的时候答案比较雷同,二来可以通过准备答案的过程学习些数据库的知识。 回答数据库的
问题
,需要有一定的高度,因为数据库是一个整体
Windows XP启动慢的
问题
今天打开电脑居然慢到死。主要现象就是,开机进到桌面以后,那个桌面不完全显示,那个本地连接、输入法那些都没启动起来。 一般来说,电脑启动慢都是因为系统服务开启的
问题
。于是就用以前用的雨林木风的一键优化服务弄了下。这个对于基本电脑要求是可以的。以前都偷懒就直接用这个,不过这次不行。所以自己慢慢找吧。把全部的服务都逐个看简介并重新分配自动、手动、禁止。 基本试过。加searching解决了
问题
。 ...
ATL
3,248
社区成员
48,529
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章