主程序调用dll 关闭窗口时出现Invalid pointer operation(20分)

  • 主题发起人 主题发起人 admin2008
  • 开始时间 开始时间
A

admin2008

Unregistered / Unconfirmed
GUEST, unregistred user!
写了个dll 只有这一个过程调用后退出窗口出现Invalid pointer operation 麻烦大家帮我看下:
procedure Open_TreeNode(table_name,field,field1,all_type:pchar;tv:TRzTreeView);stdcall;
var
adotmp: TadoQuery;
parentNode,curNode:TTreeNode;
begin
CoInitialize(nil);
TLCYGLXT:=TTLCYGLXT.Create(nil);
adotmp:=Tadoquery.Create(nil);
adotmp.Connection:=TLCYGLXT.ADOconn ;
tv.SetFocus ;
tv.Items.Clear ;
parentNode:=tv.Items.AddChild(nil,all_type);
parentNode.ImageIndex:=0;
tv.Items.BeginUpdate ;
with adotmp do
begin
close;
sql.Clear ;
sql.Text:='select '+field+' from '+table_name+' order by '+field1+' desc';
open;
first ;
while not eof do
begin
curNode:=tv.Items.AddChildFirst(parentNode,pchar(trim(FieldByName(field).AsString)));
curNode.ImageIndex:=1;
curNode.SelectedIndex:=1;
next;
end;
end;
tv.Items.EndUpdate ;
parentNode.Expanded:=true;
adotmp.Free;
CoUninitialize;
end;
 
同学,创建了的家伙都正确释放了吗?
比如

TLCYGLXT:=TTLCYGLXT.Create(nil);
 
释放了也还是不行 同样退出窗口出现Invalid pointer operation
 
检查一下,是否需要声明 sharemem, 我遇到过多次,都是忘记声明 sharemem
 
curNode:=tv.Items.AddChildFirst(parentNode,pchar(trim(FieldByName(field).AsString)));经过代码测试 发现问题在这句上 我改成这样也不行tv.Items.AddChildFirst(parentNode,'fd'); 同样退出窗口提示:Invalid pointer operation
 
这个跟楼主贴的代码没啥关系,也不是 sharemem 的问题。
就算对象没释放,也不会有错误警告的。
比较可能的情况是释放已经自动释放的对象。
 
你要把主程序的句柄传给DLL,然后在退出DLL是释放,不要用 nil
 
都有释放的 在dll中的其它函数调用都没有问题 只有这个才出现退出窗口错误
 
看看 sharemem
delphi 的内存管理的问题
dll分配的内存 返回给 exe
不用 sharemem 有问题
 
我没有用这个单元 sharemem
 
是ado的问题引起的,你用的是那个版本,打了补丁没有啊?
和ADO相关的东西最好不要放在DLL里调用,
因为ADO本身就是微软公司的COM,你在放在DLL里使用很容易出错的。
 
楼主所说的ado版本问题 不太清楚 不是delphi自带有的吗?
这个问题咱就解决不了呢 郁闷!
 
procedure Open_TreeNode(table_name,field,field1,all_type:pchar;tv:TRzTreeView);stdcall; //tv显示数据
var
adotmp: TadoQuery;
parentNode,curNode:TTreeNode;
begin
CoInitialize(nil);
TLCYGLXT:=TTLCYGLXT.Create(nil);
adotmp:=Tadoquery.Create(nil);
adotmp.Connection:=TLCYGLXT.ADOconn ;
adotmp.Connection.LoginPrompt:=false;
tv.Items.Clear ;
parentNode:=tv.Items.AddFirst(nil,pchar(all_type));
parentNode.ImageIndex:=0;
parentNode.HasChildren:=true;
tv.Items.BeginUpdate ;
with adotmp do
begin
close;
sql.Clear ;
sql.Text:='select '+field+' from '+table_name+' order by '+field1+' desc';
open;
first ;
while not eof do
begin
showmessage('fsfd');
// curNode:=tv.Items.AddChild(parentNode,pchar(trim(FieldByName(field).AsString))) ;
// curNode.ImageIndex:=1;
// curNode.SelectedIndex:=2;
next;
end;
end;
tv.Items.EndUpdate ;
parentNode.Expanded:=true;
adotmp.Free ;
CoUninitialize;
end;
如果我把循环语句那段用showmesage测试发现退出窗口不会出错 再次打开然后关闭窗口都正常 可是我用循环语句中的屏蔽的三行代码 第一次退出窗口时是正常的 当再次打开窗口然后关闭时就出现Invalid pointer operation 有朋友说要释放TLCYGLXT 也测试了不行
 
还没解决吗? 隔山买牛,大家只有猜,很难答的,一般不释放对象,不会报错。
QQ:65686789 z20010101@163.com 类似程序, n多年前写过,可以帮你调试。
 
好 我有加你QQ
 
哦,今日加我的五六人,不知道你是哪位
 
就是没有声明sharemem ,这个是引用DLL时必须声明的单元,在DLL文件的单元开头的部分的英文说明中有说明的。
 
wuliaoderen
没用的 我都试过
 
sharemem 不是需要的,Dll 在函数里面传递字符串的时候,而且是较长的字符串才需要加sharemem,一般传的都是指针,是不需要的,既然看到英文,为什么不仔细读一下。我从来都不加这个东西,楼主如果还卡着,贴出全部代码,最好寄来帮你改。
 
后退
顶部