• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

关于Delphi中指针使用的心得

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
     前段时间一直在搞一个项目,常用到ListView,而且常把Record放入ItemData。一开始我就把对ListView的常规操作都写入一个Dll(包括批量的添加数据,保存数据,加载数据),方便于以后的使用。这是恶梦的开始。

     这样做不要紧,等项目越做越深入时,越来越多的问题突现。只要对ListView操作不管什么操作,添加、删除,就是点击某行,就会跳出“Invalid pointer operation”,或者“Access violation ”某个地址错误。这使得我的项目进程大大受限,最后不得不停下来专心解决这个问题。

     一开始,我并不认为是调用DLL时的问题,当我把其它一些功能层层剥离时发现,就连LoadLibrary('8888.dll');都会出错。最后不得不把注意力放在操作ListView的DLL中。

    这个DLL中有这样一段代码
 1function SetSubColumns( var Xml: IXMLDocument;
 2                        AddNodeName: WideString;
 3                        var ColumnsField : TStringList;
 4                        var Lv: TListView ):Boolean;stdcall;
 5var
 6    ListItem : TListItem;
 7    DataNode: IXMLNode;
 8    NodeList: IXMLNodeList;
 9    HideStr : PItemData;
10    i,j: Integer;
11begin
12    try
13        NodeList := Xml.DocumentElement.ChildNodes;
14        for i := 0 to NodeList.Count - 1 do
15        begin
16            ListItem := Lv.Items.Add;
17            DataNode := NodeList[i];
18end;

     其中有一段代码为New(HideStr);为ItemData分配内存,这才是问题的所在。语法本身是没有任何问题,但是放错了地方,因为我调用这个DLL时是动态调用,执行完后直接FreeLibrary了,当FreeLibrary时,同时也释放了ItemData所对应的内存地址。所以第一次操作ListView时没有任何问题,第二次操作时就错误百出。

     解决的方法有只有一个,就是把分配内存的操作放入主线程,不要放入DLL中。

     总结,对于分配内存的操作还是由主程序(主线程)来分配,这样操作起来方便而且不会出错,当主程序关闭时,会一起把分配的内存释放掉。真是吃一堑长一智啊。
 

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab绘制三维曲面(以二维高斯函数为例)发布时间:2022-07-18
下一篇:
基于Delphi的融合DLL中的窗口发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap