dll单元中封装了一个窗体,宿主程序调用该dll中的函数显示窗体,但是到最后关闭dll中窗体的时候就
报:“project XXX.exe raised too many consecutive exceptions:'access violation at 0x0303c06:read of
address 0x0303c600'...” 断点调试跟踪不到,搞的快疯了!dll和宿主程序中加入 uses sharemem 也没有效果,
不知道是什么问题,刚开始的时候做了一个程序调用都没有问题,可以后来试了嵌入其他几个程序都报相同的错误。真是十分的不解!望有经验的帮忙,快急死了!
报:“project XXX.exe raised too many consecutive exceptions:'access violation at 0x0303c06:read of
address 0x0303c600'...” 断点调试跟踪不到,搞的快疯了!dll和宿主程序中加入 uses sharemem 也没有效果,
不知道是什么问题,刚开始的时候做了一个程序调用都没有问题,可以后来试了嵌入其他几个程序都报相同的错误。真是十分的不解!望有经验的帮忙,快急死了!
解决方案 »
- Delphi做菜单管理问题
- 软件更新的问题
- 图像格式转换,在线等,急需
- TTabControl与TPageControl
- 安装制作问题!帮忙
- 怎样删除一个含有文件与子文件的文件夹。
- 欲将一个目录结构保存在Access数据库中(目录要求能随时移动,重排序等),然后从其读出,显示为TTreeCtrl的方式,不知数据结构和数据库
- 问题:1、ACCESS中能装入BLOB字段吗?2、为什么我编译Shellexcute的时候老是报没有定义???
- 上传下载文件,用ftp?winSocket?还是DCOM?
- Delphi 中怎样写汇编过程之间的调用?请付例子,急,加分!!
- 程序最小化的问题
- 欢迎参观我的Delphi个人主页 http://www.feiyuexxw.com/bbs/index.asp?boardid=24
function _test(parray:pchar;var index:Integer;name:pchar):Integer;
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);
end;
finally
freelibrary(myhandle);
freelibrary(myhandle1);
freelibrary(myhandle2);
end;
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;
比如
freedll
begin
if assigned(form1) then
begin
form1.close; //dll单元中封装了一个窗体
freeandnil(form1);
end;
end;在 freelibrary(myhandle); 前调用,是一个简单的解决方法
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:很久不见阿日。