调用动态库后为何不能正常退出.(50分)

  • 主题发起人 主题发起人 ccweifen
  • 开始时间 开始时间
C

ccweifen

Unregistered / Unconfirmed
GUEST, unregistred user!
主程序退出时总是出现如下错误:
...invaild pointer ..
我在DLL文件和主程序的USES中都以加了 ShareMem单元.
DLL中是一个过程.
 
几乎可以肯定与主程序和DLL间的参数传递相关。
虽然你加了ShareMem单元,但是不是在各自的项目文件中?是不是加在第一行?
还有对所有内存的操作顺序是否不对?
不过我还是建议你使用MS的习惯:传递一个结构指针,至于串则用PChar好啦!

说实话,我从前写DLL总出现类似问题,后来明白了,每次加ShareMem,但总不是办法。
潜心研究,结果现在再复杂的DLL我也不引ShareMem了,而且再也不出现类似的错误。

有几点:
1.参数中的const、var、out声明决不是可有可无的;
2.不要企图改变每个程序块中的各自申请的堆内存的块大小;
3.类相关:主程序中建立的类,如果类中有串字段,决不要在DLL中释放,相反一样。
 
肯定是参数传递没有处理好,记得不要用string类型,而是用pchar类型,这样肯定不会错,
也不需要什么sharemem单元,在复杂的Dll也不怕.........
我有很多复杂的dll.需要参考嘛?
 
字符串我都用了PCHAR来传递的,没有用到STRING类型,
里面还传递了一个TQUERY,和这有关系吗?
hua8hua:能发一个简单点的例子给我吗?
谢谢!

Mail: ccweifen@263.net
 
明白了。你在Dll中调用了主程序中的类的方法,或在主程序中调用了Dll中的类的方法。
这不行。我为这个问题琢磨过三天。TQuery在Dll中执行方法时要申请空间。等于改变了
它的大小。我是这么处理的:在Dll中建立这个Query,加入参数,执行完将结果存到流
中(TField有流操作方法),将流地址和长度作为输出参数传给主程序,然后到主程序中
复制成TField。记住:这个流一定要交给Dll出释放。
 
barton: 我不太明白你的做法,能给个例子吗?
 
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;
 
P 的实参的什么?
 
哦我错了应该是:
function MyQuery(const ASQL: string; var P: Pointer): Integer; stdcall;

现在是否明白?

 
接受答案了.
 
后退
顶部