首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

dll 释放时报错 高手帮忙解决思路

2012-03-18 
dll 释放时报错 高手帮忙dll单元中封装了一个窗体,宿主程序调用该dll中的函数显示窗体,但是到最后关闭dll

dll 释放时报错 高手帮忙
dll单元中封装了一个窗体,宿主程序调用该dll中的函数显示窗体,但是到最后关闭dll中窗体的时候就
报:“project XXX.exe raised too many consecutive exceptions:'access violation at 0x0303c06:read of 
address 0x0303c600'...” 断点调试跟踪不到,搞的快疯了!dll和宿主程序中加入 uses sharemem 也没有效果,
不知道是什么问题,刚开始的时候做了一个程序调用都没有问题,可以后来试了嵌入其他几个程序都报相同的错误。真是十分的不解!望有经验的帮忙,快急死了!

[解决办法]
这样别人只能猜原因了,你那个报错的窗体,是实现什么功能的,比如是否涉及多线程等,最简单的方法,就是你做一个空白的,没有任何功能的窗体调用一下看看,如果还是错,就是你的调用方法问题,如果没有错了,就是你的被调用窗体内部的功能代码的问题了,比如线程释放
[解决办法]
由于delphi的form封装时有application对象,而宿主程序和dll的application不同所以在宿主程序退出时会出错,所以在调用时应先把宿主的application传个dll,下面代码是写在丁零零里的,创建窗口前先运行这个.
var
DllApp:TApplication;

{ 用于初始化:保存DLL本身的Application,然后设置DLL的Application指向Host的Application }
procedure InitDLL(App:TApplication);stdcall;
begin
DllApp:=Application;
Application:=App;
end;

{ 善后工作:恢复DLL原来的Application }
procedure FreeDLL;stdcall;
begin
Application:=DllApp;
end;
[解决办法]
dll 中增加一个函数,
比如
freedll
begin
 if assigned(form1) then
 begin
 form1.close; //dll单元中封装了一个窗体
 freeandnil(form1);
 end;
end;

在 freelibrary(myhandle); 前调用,是一个简单的解决方法


[解决办法]
var
myhandle,myhandle1,myhandle2:Thandle;
myfunc:function (parray:pchar;var index:Integer;name:pchar):Integer;StdCall;
begin
result:=-1;
myhandle1:=loadlibrary( '1.dll ');
myhandle2:=loadlibrary( '2.dll ');
myhandle:=loadlibrary( 'mydll.dll ');
if (myhandle <=0) then
begin
application.MessageBox( '找不到 mydll.dll ! ', '警告 ');
exit;
end;
try
@myfunc:=getprocaddress(myhandle, 'test ');

if (@myfunc < > nil) then
begin
result:=myfunc(parray,index,name); -------->这个里面是怎么显示窗体的?是Show还是ShowModal?
ShowModal时是怎么Close?, 因为你接下来就FreeLibrary. 而静
态调用时,宿主程序释放才释放LIB的。
end;
finally
freelibrary(myhandle);
freelibrary(myhandle1);
freelibrary(myhandle2);
end;


BTW:很久不见阿日。

热点排行