• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 关于中COM中的传入,传出参数的资源释放问题?

关于中COM中的传入,传出参数的资源释放问题?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了 关于中COM中的传入,传出参数的资源释放问题?等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 关于中COM中的传入,传出参数的资源释放问题?
描述:

在COM中,除了IUnknown的AddRef,Release(返回ULONG参数)特殊外,其它的任何函数都必须返回HRESULT.
所以就有了传入参数,传出参数.
如果传入传出的仅仅是基本类型的数据,如int,long,BYTE等,那也没有资源释放问题(由本地栈解决了).
如果传入传出的是一些Pointer,如BSTR,IDispatch&等那就存在一个资源释放的问题,可是它们该由那一方释放啊,还是双方都要释放.就像编译器指令__stdcall一样,规定了参数栈该由那一方恢复.
下面举一个例子:
    A组件:
        idl片段:
        HRESULT Hello([out]BSTR* bstrOut);
       
        实现:
        HRESULT Hello(BSTR* bstrOut){
            *bstrOut=SysAllocString(OLESTR("Hello"));
            //需要释放该BSTR资源吗? 还是由调用者释放?
            //SysFreeString(*bstrOut); 
            return S_OK;
        }
    B组件:
       idl片段:
       HRESULT Goodbye([in]BSTR bstrIn);
       实现:
       HRESULT Goodbye(BSTR bstrIn){
           ....
           
           //该方法调用者在方法返回时是否也要释放该资源?
           SysFreeString(bstrIn);
           return S_OK;   
       }
请教各位大侠........


解决方案1:

对于in参数,自然是客户分配,组件也不用释放
对于out参数,组件用任务分配器分配,客户也要用任务分配器释放
任务分配器是一个专门用于管理由组件分配的内存需要客户释放的问题,它是一个实现了IMalloc接口的组件。COM提供一个已有的实现。具体用法是:
组件内使用CoTaskMemAlloc,然后在客户端使用CoTaskMemFree(如果客户端是VB,运行时解释器自动调用)
如果要重新分配[in, out]参数的内存大小,组件内不要使用CoTaskMemAlloc而应使用CoTaskMemRealloc
对于BSTR类型,有专用的函数SysAllocString和SysFreeString

解决方案2:

[in],[in,out],[out]的顶级指针由client负责分配和回收(除非out string,由组件分配,客户回收,分别使用CoTaskMemAlloc,CoTaskMemFree),关于次级指针较复杂(com本质论有详细论述),也很少会用(即结构体中的指针成员).

解决方案3:

对于[in]参数没什么好说的。
对于[out]参数,COM里面有个约定,由COM分配内存,由调用者来释放。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 关于中COM中的传入,传出参数的资源释放问题?

相关文章

  • 2017-06-05 请教一个问题,com进程服务中中调用afxmessagebox出错
  • 2017-06-04 一个最难的问题—关于ActiveX控件背景色透明的问题
  • 2017-06-05 DLL的问题
  • 2017-06-04 COM初始化出错!
  • 2017-06-04 webbrowser控件的工作原理
  • 2017-06-05 SIFT_VC运行报错,求助
  • 2017-06-05 使用boundchecker检查程序发现一下问题,比较郁闷!
  • 2017-06-05 各位大虾请问怎样实现线程同步?
  • 2017-06-05 高手请进:关于VC不能使用VB创建的DLL的问题,真是郁闷!!!
  • 2017-06-04 ExitWindows、IXY请进来领分。版主请勿删,借个地方,谢谢了。

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 怎样在启动一个程序的时候先启动自己的一个程序,然后才允许该程序启动就你有的病毒感染一样?
    • 我在县城里新建了一个CDialog类,然后domodal,结果是直接跳过了。
    • 控件中的文字显示问题(急!!!!!!!!在线等!!!!!)
    • 请问在WebBrowser控件时如何隐藏滚动条并且自由设置网页在控件中的位置?
    • 请教大家一个有关ole拖放方面得问题很急
    • 紧急求助-----属性可见问题?SOS
    • 如何将COM+组件的接口方法设置为只能被COM+应用程序内部使用?
    • COM被调用时的当前路径是什么?
    • 在MFC下使用控件接口类CPictureHolder怎么用?使用其CreateFromBitmap函数实现从bitmap图像生成对象时老执行出错!
    • 创建一个线程后,怎样结束线程

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有