C ccweifen Unregistered / Unconfirmed GUEST, unregistred user! 2000-11-20 #1 主程序退出时总是出现如下错误: ...invaild pointer .. 我在DLL文件和主程序的USES中都以加了 ShareMem单元. DLL中是一个过程.
B barton Unregistered / Unconfirmed GUEST, unregistred user! 2000-11-21 #2 几乎可以肯定与主程序和DLL间的参数传递相关。 虽然你加了ShareMem单元,但是不是在各自的项目文件中?是不是加在第一行? 还有对所有内存的操作顺序是否不对? 不过我还是建议你使用MS的习惯:传递一个结构指针,至于串则用PChar好啦! 说实话,我从前写DLL总出现类似问题,后来明白了,每次加ShareMem,但总不是办法。 潜心研究,结果现在再复杂的DLL我也不引ShareMem了,而且再也不出现类似的错误。 有几点: 1.参数中的const、var、out声明决不是可有可无的; 2.不要企图改变每个程序块中的各自申请的堆内存的块大小; 3.类相关:主程序中建立的类,如果类中有串字段,决不要在DLL中释放,相反一样。
几乎可以肯定与主程序和DLL间的参数传递相关。 虽然你加了ShareMem单元,但是不是在各自的项目文件中?是不是加在第一行? 还有对所有内存的操作顺序是否不对? 不过我还是建议你使用MS的习惯:传递一个结构指针,至于串则用PChar好啦! 说实话,我从前写DLL总出现类似问题,后来明白了,每次加ShareMem,但总不是办法。 潜心研究,结果现在再复杂的DLL我也不引ShareMem了,而且再也不出现类似的错误。 有几点: 1.参数中的const、var、out声明决不是可有可无的; 2.不要企图改变每个程序块中的各自申请的堆内存的块大小; 3.类相关:主程序中建立的类,如果类中有串字段,决不要在DLL中释放,相反一样。
H hua8hua Unregistered / Unconfirmed GUEST, unregistred user! 2000-11-21 #3 肯定是参数传递没有处理好,记得不要用string类型,而是用pchar类型,这样肯定不会错, 也不需要什么sharemem单元,在复杂的Dll也不怕......... 我有很多复杂的dll.需要参考嘛?
肯定是参数传递没有处理好,记得不要用string类型,而是用pchar类型,这样肯定不会错, 也不需要什么sharemem单元,在复杂的Dll也不怕......... 我有很多复杂的dll.需要参考嘛?
C ccweifen Unregistered / Unconfirmed GUEST, unregistred user! 2000-11-21 #4 字符串我都用了PCHAR来传递的,没有用到STRING类型, 里面还传递了一个TQUERY,和这有关系吗? hua8hua:能发一个简单点的例子给我吗? 谢谢! Mail: ccweifen@263.net
字符串我都用了PCHAR来传递的,没有用到STRING类型, 里面还传递了一个TQUERY,和这有关系吗? hua8hua:能发一个简单点的例子给我吗? 谢谢! Mail: ccweifen@263.net
B barton Unregistered / Unconfirmed GUEST, unregistred user! 2000-11-22 #5 明白了。你在Dll中调用了主程序中的类的方法,或在主程序中调用了Dll中的类的方法。 这不行。我为这个问题琢磨过三天。TQuery在Dll中执行方法时要申请空间。等于改变了 它的大小。我是这么处理的:在Dll中建立这个Query,加入参数,执行完将结果存到流 中(TField有流操作方法),将流地址和长度作为输出参数传给主程序,然后到主程序中 复制成TField。记住:这个流一定要交给Dll出释放。
明白了。你在Dll中调用了主程序中的类的方法,或在主程序中调用了Dll中的类的方法。 这不行。我为这个问题琢磨过三天。TQuery在Dll中执行方法时要申请空间。等于改变了 它的大小。我是这么处理的:在Dll中建立这个Query,加入参数,执行完将结果存到流 中(TField有流操作方法),将流地址和长度作为输出参数传给主程序,然后到主程序中 复制成TField。记住:这个流一定要交给Dll出释放。
C ccweifen Unregistered / Unconfirmed GUEST, unregistred user! 2000-11-22 #6 barton: 我不太明白你的做法,能给个例子吗?
B barton Unregistered / Unconfirmed GUEST, unregistred user! 2000-11-23 #7 var Stream: TStream; function MyQuery(const ASQL: string; P: Pointer): Integer; stdcall; begin with TQuery.Create(nil) do try database := ???; SQL.Text := ASQL; Open; Stream := TMemoryStream.Create; //将数据存到流中 Result := Stream.Size; P := TMemoryStream.Memory; finally close; free; end; end;
var Stream: TStream; function MyQuery(const ASQL: string; P: Pointer): Integer; stdcall; begin with TQuery.Create(nil) do try database := ???; SQL.Text := ASQL; Open; Stream := TMemoryStream.Create; //将数据存到流中 Result := Stream.Size; P := TMemoryStream.Memory; finally close; free; end; end;
B barton Unregistered / Unconfirmed GUEST, unregistred user! 2000-11-24 #9 哦我错了应该是: function MyQuery(const ASQL: string; var P: Pointer): Integer; stdcall; 现在是否明白?