在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
这样做不要紧,等项目越做越深入时,越来越多的问题突现。只要对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中。 总结,对于分配内存的操作还是由主程序(主线程)来分配,这样操作起来方便而且不会出错,当主程序关闭时,会一起把分配的内存释放掉。真是吃一堑长一智啊。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论