Delphi调用DLL中的接口
2013-10-09 12:12
399 查看
问题描述:
具体问题就是在隐式使用接口变量后,在FreeLibrary执行后,就会出现一个非法访址的错误。
这个错误的原因就是在FreeLibrary后,DLL以的代码均为不可用状态,而在代码执行完整个过程后,VCL要对RTL类型的数据进行清理。而在清理过程中肯定要对接口进行减1并进行释放相关对象。而对象代码已从进程空间卸载,故报非法访址错误!
解决方法:
所以要想解决该问题,就应该把DLL调用过程放到一个单独的过程中,其目的就是让调用完毕后,让VCL来清理接口。清理完毕后返回后,再调用FreeLibrary来从进程空间中卸载DLL。
错误调用代码为:
View Code
具体问题就是在隐式使用接口变量后,在FreeLibrary执行后,就会出现一个非法访址的错误。
这个错误的原因就是在FreeLibrary后,DLL以的代码均为不可用状态,而在代码执行完整个过程后,VCL要对RTL类型的数据进行清理。而在清理过程中肯定要对接口进行减1并进行释放相关对象。而对象代码已从进程空间卸载,故报非法访址错误!
解决方法:
所以要想解决该问题,就应该把DLL调用过程放到一个单独的过程中,其目的就是让调用完毕后,让VCL来清理接口。清理完毕后返回后,再调用FreeLibrary来从进程空间中卸载DLL。
错误调用代码为:
//前端调用 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,DLLInf; type TTestObj=function:ITest;stdcall; TForm1 = class(TForm) btn1: TButton; edt1: TEdit; procedure btn1Click(Sender: TObject); private { Private declarations } TestObj: TTestObj; myDLLHandle: THandle; procedure getDLLObject; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.getDLLObject; var testStr:Widestring; begin testStr:='Test String'; @TestObj:= GetProcAddress(myDLLHandle, 'TestObj'); if @TestObj<>nil then TestObj.ShowMSG(testStr) //调用DLL中的对象并执行相关方法 else Application.MessageBox('在Dll动态链接库中加载方法失败!','提示',mb_ok); end; procedure TForm1.btn1Click(Sender: TObject); begin myDLLHandle:=loadlibrary('DLLDemo.dll'); try if myDLLHandle>0 then getDLLObject; finally FreeLibrary(myDLLHandle); End ; end; end.
View Code
相关文章推荐
- Delphi调用DLL中的接口
- Delphi调用DLL中的接口(转)(一个FreeLibrary时 报错的解决方案)
- Delphi调用DLL中的接口
- C#调用delphi dll接口问题
- Delphi采用接口实现DLL调用
- Delphi DLL使用接口和调用的方法
- 40、C#:如何调用外部dll的接口
- C#调用Delphi编写的Dll,实现绘图的功能
- Delphi 调用Dll的两种方式
- 在非VS环境下C++ Builder,Delphi,VC,VB等调用C#开发的DLL的完整方法
- VC6动态调用DELPHI DLL
- Delphi调用VC++6.0编写的Dll
- 如何在java中使用jna.jar调用Delphi写的dll
- Delphi中dll的创建和调用
- 在.net中调用Delphi dll的Pchar转换
- delphi从dll中调用图片资源
- 三种语言对Delphi的dll的调用
- Delphi环境中编写调用DLL的方法和技巧
- 经验教训:Delphi中out string 被外部通过Dll调用引发的错误
- 在Delphi中静态调用DLL 引用外部Dll External Dll 导入Dll