中国程序员联盟 正在重新改版中ing 不便之处还请见谅 改版后将内容涉及java delphi .net php
 
  首页 | 数据库开发 | 网络通讯 | 多线程 | 多媒体开发 | 图像处理 | 程序人生 | 系统函数 | 控件开发 | Web服务
 
  当前位置:笨鱼delphi技术网>数据库开发>开发应用>文章内容

delphi COM中分配内存的注意事项

来源: 关于:苏华 发布时间:2007-06-21   [收藏] [推荐]

我发现DELPHI的内存分配和释放函数GetMem和FreeMem最好不要在COM组件的编写过程中使用

否则可能会产生错误.

事情的经历是这样的,由于工作需要,要将一个VC写的DLL用DELPHI封装成为COM组件,在COM

中我需要分配一些内存然后传给VC写的这个DLL由他款充后然后再由我使用.

就是这样一个过程,在使用内存的时候我使用的是GetMem和FreeMem来进行的,程序开始运行

的时候没有问题,可是当一个操作连续跳几次之后问题就来了,灾难性错误,这种错误虽然在

COM组件的编写过程中常见,但是也绝对是令人头痛的事情.于是我开始找错.

最初我怀疑错误是VC DLL填写我分配的内存区所造成的,可是后来经过查找后这种可能性被

排除.这时我就已经感觉到可能是由DELPHI中的内存分配函数与COM组件兼容性不好,所造成

的这个问题,但是又一时没有其它的函数替换.

万般无奈之下向HUBDOG请教,被告之,在COM中分配内存最好使用IMalloc接口来实现

我就象是得到了救命稻草一样,马上在程序中试了一下,果然如此.看来问题的确是由DELPHI

的内存分配函数所造成的.

补充说明一点:出错的代码段是使用GetMem分配了1.4K左右的内存,而只分配了几百字节的代

码段则没有事情.

来自:Hongjiang, 时间:2001-4-9 22:39:30, ID:497062

不同的开发环境分配内存的方式是不一样的,COM是基于二进制的对象重用方式,

为了能够在不同的环境中使用COM组件,COM对内存的分配和释放是有要求的,即

要通过IMalloc接口来分配和释放内存(IMalloc::Alloc, IMalloc::Free),或者

调用CoTaskMemAlloc, CoTaskMemFree。同时,COM对内存的分配和释放的职责

也是有规定的,对于[in]参数,内存应该由Client分配和释放,对于[out]参数,

内存由Server分配,但是由Client释放,对于[in,out]参数,内存可以在Client

端分配,在Server端可以被释放,然后再分配,最后在Client端释放。

COM其实对一个熟悉C++的程序员来说并不是很困难,仔细研究一下从类重用方式

转化到二进制重用的方式所碰到的问题,就会明白COM为什么会是这样的,而且本质

上来说,COM和Class没有多少区别。


[浏览: 次]   
上一篇:delphi Oracle Siebel托管型CRM软件荣膺客户服务管理软件领导者称号   下一篇:delphi 输出TDataset中的内容至逗号侵害的ASCII文件
[收藏] [推荐] [返回顶部] [打印本页] [关闭窗口]  
    评论加载中…
google adsense热点文章
·delphi Delphi_三谈多态——善用virtua
·delphi 条形码处理
·delphi Delphi_三层开发基本概念介绍
·delphi 汉字转拼音码(上)
·delphi Olevariant
·delphi CS构架下的客户端自动更新程序
·delphi 在Dephi中使用TStream读写数据
·delphi delphi处理流
·delphi 汉字转拼音码(下)
·delphi 关于使用COM对象的方法
·delphi MTS组件——从理论到实践
·delphi 汉字转拼音码(中3)
     delphi技术网 | firefox 下载 | Avant Browser下载 | dedecms 技术网 | drupal 爱好者 | php 技术网
  Copyright@www.delphichm.com,2006-2009.All Rights Reserved.
 
程序员联盟 | delphi Java .net|QQ:707102932