delphi中dll综合运用的例子
delphidll例子

delphidll例子【篇一:delphidll例子】为了让人能快速的理解静态调用、动态调用,现在做一个函数封装在一个dll中,然后在application form里面调用这个函数,这个函数处理两个数的和。
用代码和图片说话:代码如下library project1;{ important note about dll memory management: sharemem must be thefirst unit in your librarys uses clause and your projects (select project-view source) uses clause if your dll exports any procedures orfunctions that pass strings as parameters or function results. thisapplies to all strings passed to and from your dll--even those thatare nested in records and classes. sharemem is the interface unit tothe borlndmm.dll shared memory manager, which must be deployed alongwith your dll. to avoid using borlndmm.dll, pass string informationusing pchar or shortstring parameters. }usessysutils,classes;function incc(a,b:integer):integer; stdcall; //真正的代码开始;beginresult :=a+b;end;{$r *.res}exports//允许调用;incc;end.按ctrl+f9编译以后会在文件夹下面会产生一个 project1.dll的dll文件。
Delphi中控制Word,xml,dll等操作

Delphi中控制Word,xml,dll等操作DLL的建立与调用[转]动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。
由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可以实现一些一般程序所不能实现的功能,如实现windows的HOOK、ISAPI等。
同时,DLL还为不同语言间代码共享提供了一条方便的途径。
因而DLL在编程时应用较为广泛,本文将介绍如何在Delphi 中建立和使用DLL。
一.DLL 库内存共享机制从使用效果看,DLL和unit 很像,它们都可以被别的工程模块所调用,但二者在内部的实现机制上确存在着差别。
如果一个程序模块中用uses语句引用了某个unit,编译程序在编译该模块时,便会连同unit一起编译,并把编译后的可执行代码链接到本程序模块中,这就是一个程序模块能够调用所引用unit中过程和函数的原因。
当同一个unit被多个工程所引用时,则每个工程中都含有该unit的可执行代码,当含有该unit的多个工程同时执行时,unit的可执行代码会随不同工程而多次被调入内存,造成内存资源的浪费。
DLL则不同,它即使被某个工程调用,编译后仍是独立的。
也就是说编译后,一个DLL库形成一个单独的可执行文件,而不与任何其它的可执行文件连接在一起,因而DLL库并不从属于某个特定的工程,当多个工程调用同一个DLL库时只有第一个工程把DLL库调入内存,其余工程并不重复调入同一个DLL库到内存,而是到同一个共享内存区读取。
并且,DLL的执行代码是在程序运行期间动态调入的,而不是如unit在程序运行时就与整个工程一起调入内存。
这样便可消除unit带来的相同代码多处占用内存的弊病。
二 Delphi中DLL库的建立在Delphi环境中,编写一个DLL同编写一个一般的应用程序并没有太大的区别。
事实上作为DLL主体的DLL函数的编写,除了在内存、资源的管理上有所不同外,并不需要其它特别的手段。
Delphi如何调用C++写的DLL

Delphi如何调用C++写的DLLBOOL WINAPI funname(char *pFileName,char *pID);这是C++写的一个DLL里面的函数我现在想用delphi调用这个函数静态:function funname(var pFileName:pchar;var pID:pchar):integer;stdcall;external 'DLLNAME.dll' name 'funname';动态:OneHandle := LoadLibrary(DLLNAME.dll'); //动态载入DLL,并返回其句柄tryif oneHandle<>0 then@funname:= GetProcAddress(OneHandle,'funname');if not( @funname = nil ) then.....finallyFreeLibrary(OneHandle);现在调试数据不成功是不是传参问题呢还是函数在delphi里调用不对调用应该是成功的哪位高手帮帮忙--------------------------------------------------------------------------------试过了不行滴说--------------------------------------------------------------------------------typeTFun = function(FileName: PChar; ID: PChar): BOOL; stdcall;varFunc: TFunc;beginHandle := LoadLibrary(DLLNAME.dll'); //动态载入DLL,并返回其句柄tryif Handle > 0 thenFunc := GetProcAddress(Handle, 'funname');if Assigned(Func) thenFunc('MyFileName', 'MyID');finallyFreeLibrary(Handle);end--------------------------------------------------------------------------------function funname(pFileName:pchar; pID:pchar):integer; stdcall; external 'DLLNAME.dll' name 'funname';这样试下,一般char *对应的是PChar,而不是var A: PChar--------------------------------------------------------------------------------dll可能不是按照标准顺序调用参数的--------------------------------------------------------------------------------先用vc++做个dll,记得声明函数的时候要_stdcall做前缀,例如:_stdcall int TestC(int i);_stdcall char* add1(char *s);然后将此dll放在delphi程序的目录里,在delphi动态引用此dll 的某函数的时候,要用cdecl做后缀;例如:M:function(i:integer):integer;cdecl;M1:function(i:pChar):pChar;cdecl;--------------------------------------------------------------------------------function funname(pFileName:pchar; pID:pchar):integer; stdcall; external 'DLLNAME.dll' name 'funname';也可以这样试试function funname(pFileName:pchar;var pID:char):integer; stdcall; external 'DLLNAME.dll' name 'funname';--------------------------------------------------------------------------------delphi中的char *是pansichar--------------------------------------------------------------------------------ansean基本把这个问题说清楚了。
delphi 调用dll struct 参数

标题:Delphi中使用DLL调用及结构参数传递的方法一、引言在Delphi中,我们经常需要使用动态信息库(DLL)来实现对外部功能的调用。
而在调用DLL时,有时需要传递结构参数,本文将介绍在Delphi中使用DLL进行结构参数传递的方法。
二、调用DLL1. 静态信息和动态信息在Delphi中,我们可以通过静态信息和动态信息两种方式调用DLL。
静态信息是将DLL文件直接嵌入到可执行文件中,而动态信息则是在程序运行时加载DLL文件。
一般来说,动态信息是更为常用的方式。
2. 使用动态信息调用DLL在Delphi中使用动态信息调用DLL,一般需要使用`LoadLibrary`函数加载DLL文件,然后使用`GetProcAddress`函数获取DLL中的函数位置区域,最后通过指针调用DLL函数。
示例代码如下:```delphivarhDLL: THandle; // DLL句柄addFunc: function(a, b: Integer): Integer; stdcall; // DLL函数指针beginhDLL := LoadLibrary('MyDll.dll'); // 加载DLLif hDLL <> 0 thenbegin@addFunc := GetProcAddress(hDLL, 'Add'); // 获取DLL中的Add函数位置区域if Assigned(addFunc) thenbegin// 调用DLL函数Result := addFunc(1, 2);end;FreeLibrary(hDLL); // 释放DLLend;end;```三、结构参数传递在DLL调用中,有时我们需要传递结构参数,即将自定义的结构体作为函数参数传递给DLL中的函数。
下面将介绍在Delphi中如何实现结构参数的传递。
1. 定义结构体我们需要在Delphi中定义需要传递的结构体。
DELPHI中调用DLL知识

Delphi环境中编写调用DLL的方法和技巧提起DLL您一定不会陌生,在Windows中有着大量的以DLL为后缀的文件,它们是保证Windows正常运行和维护升级的重要保证。
(举个例子,笔者的Win95 System目录下尽有500多个DLL文件。
)其实,DLL是一种特殊的可执行文件。
说它特殊主要是因为一般它都不能直接运行,需要宿主程序比如*.EXE程序或其他DLL的动态调用才能够使用。
简单的说,在通常情况下DLL是经过编译的函数和过程的集合。
使用DLL技术主要有以下几个原因:一、减小可执行文件大小。
DLL技术的产生有很大一部分原因是为了减小可执行文件的大小。
当操作系统进入Windows时代后,其大小已经达到几十兆乃至几百兆。
试想如果还是使用DOS时代的单执行文件体系的话一个可执行文件的大小可能将达到数十兆,这是大家都不能接受的。
解决的方法就是采用动态链接技术将一个大的可执行文件分割成许多小的可执行程序。
二、实现资源共享。
这里指的资源共享包括很多方面,最多的是内存共享、代码共享等等。
早期的程序员经常碰到这样的事情,在不同的编程任务中编写同样的代码。
这种方法显然浪费了很多时间,为了解决这个问题人们编写了各种各样的库。
但由于编程语言和环境的不同这些库一般都不能通用,而且用户在运行程序时还需要这些库才行,极不方便。
DLL的出现就像制定了一个标准一样,使这些库有了统一的规范。
这样一来,用不同编程语言的程序员可以方便的使用用别的编程语言编写的DLL。
另外,DLL还有一个突出的特点就是在内存中只装载一次,这一点可以节省有限的内存,而且可以同时为多个进程服务。
三、便于维护和升级。
细心的朋友可能发现有一些DLL文件是有版本说明的。
(查看DLL文件的属性可以看到,但不是每一个DLL文件都有)这是为了便于维护和升级。
举个例子吧,早期的Win95中有一个BUG那就是在闰年不能正确显示2月29日这一天。
后来,Microsoft发布了一个补丁程序纠正了这个BUG。
Delphi下DLL调用以及共享数据库连接

p(parameter) //调用Dll.含参数。
else
begin
strpcopy(b,'Method Not Defined: '+modulename+'!');
messagebox(message_parameter.mainhandle,b,
第二种:外部函数引用
做一个单元(unit),引用外部函数。例如:
function myDllCall(var i:integer): Integer; stdcall; external 'mydll.dll' name 'mydllpro';
依赖于DLL接口输出方式,或者写成:
function myDllCall(var i:integer): Integer; stdcall; external 'mydll.dll' index my_index;
process_cancel_service_form.showmodal;
process_cancel_service_form.free;
end;
(******************************)
exports
run_cancel_service;
begin
b,'Error...',mb_ok or mb_iconexclamation);
end;
end;
说明:如果你有一个dll是这么写的,
library cancel_service;
uses
在DELPHI中静态调用DLL
一、开始你的第一个DLL专案1.File->Close all->File->New﹝DLL﹞代码://自动产生Code如下library Project2;//这有段废话usesSysUtils,Classes;{$R*.RES}beginend.2.加个Function进来:代码:library Project2;usesSysUtils,Classes;Function MyMax(X,Y:integer):integer;stdcall; beginif X>Y thenResult:=XelseResult:=Y;end;//切记:Library的名字大小写没关系,可是DLL-Func的大小写就有关系了。
//在DLL-Func-Name写成MyMax与myMAX是不同的。
如果写错了,立即//的结果是你叫用到此DLL的AP根本开不起来。
//参数的大小写就没关系了。
甚至不必同名。
如原型中是(X,Y:integer)但引//用时写成(A,B:integer),那是没关系的。
//切记:要再加个stdcall。
书上讲,如果你是用Delphi写DLL,且希望不仅给//Delphi-AP也希望BCB/VC-AP等使用的话,那你最好加个Stdcall;的指示//参数型态:Delphi有很多种它自己的变量型态,这些当然不是DLL所喜欢的//,Windows/DLL的母语应该是C。
所以如果要传进传出DLL的参数,我们//尽可能照规矩来用。
这两者写起来,后者会麻烦不少。
如果你对C不熟//的话,那也没关系。
我们以后再讲。
{$R*.RES}beginend.3.将这些可共享的Func送出DLL,让外界﹝就是你的Delphi-AP啦﹞使用:光如此,你的AP还不能用到这些,你还要加个Exports才行。
代码:{$R*.RES}exportsMyMax;beginend.二、进行测试:开个新application:1.加个TButton代码:ShowMessage(IntToStr(MyMax(30,50)));2.告知Exe到那里抓个Func代码://在Form,interface,var后加Function MyMax(X,Y:integer):integer;stdcall;external'MyTestDLL.dll';//MyTestDLL.dll为你前时写的DLL项目名字//DLL名字大小写没关系。
delphi dll 参数
delphi dll 参数摘要:一、前言二、Delphi DLL 简介1.DLL 的概念2.Delphi DLL 的特点三、Delphi DLL 参数概述1.参数的定义与作用2.参数的分类四、如何使用Delphi DLL 参数1.创建DLL 项目2.定义参数3.使用参数五、Delphi DLL 参数应用实例1.实例一2.实例二六、总结正文:一、前言Delphi DLL(动态链接库)是一种可重用的代码模块,它可以在多个应用程序之间共享。
在Delphi 中,我们可以通过使用DLL 来传递参数,从而实现不同应用程序之间的数据交换和功能扩展。
本文将详细介绍Delphi DLL 参数的相关知识。
二、Delphi DLL 简介1.DLL 的概念动态链接库(DLL)是一种可重用的代码模块,它包含了在多个应用程序之间共享的代码和数据。
DLL 可以实现不同应用程序之间的数据交换和功能扩展,提高代码的复用性和程序的运行效率。
2.Delphi DLL 的特点Delphi 是一种高级编程语言,它支持创建DLL 文件。
使用Delphi 创建的DLL 具有以下特点:(1)易于理解和使用:Delphi DLL 遵循Pascal 语言规范,易于学习和使用。
(2)高效性能:Delphi DLL 编译器产生的代码具有很高的执行效率。
(3)跨平台:Delphi DLL 可以在不同操作系统和硬件平台上运行。
三、Delphi DLL 参数概述1.参数的定义与作用在Delphi DLL 中,参数是用于在模块之间传递数据的变量。
通过参数,我们可以实现模块之间的数据交换和功能控制。
2.参数的分类Delphi DLL 参数可以根据作用和传递方式进行分类:(1)输入参数:从调用模块传递给被调用模块的数据。
(2)输出参数:从被调用模块传递回调用模块的数据。
(3)常量参数:在模块之间传递的固定值。
(4)指针参数:传递内存地址的参数。
四、如何使用Delphi DLL 参数1.创建DLL 项目首先,我们需要使用Delphi 创建一个DLL 项目。
Delphi融合DLL中的窗体
Delphi融合DLL中的窗体Delphi融合DLL中的窗体2011-11-15 14:311 引言在开发一个大型通用控制系统时曾遇到这么一个问题:该系统软件包由若干个可执行文件和动态链接库组成,因为扩展性和兼容性的要求,需要将系统划分为若干个可执行文件和动态链接库,并且在大部分DLL中封装各自的操作界面,在调用DLL时将其中包含的部分界面嵌入地显示在主界面的某个区域或某个窗口内,与主界面的其他部分浑然一体。
这样主程序与DLL在功能操作上各司其职,在外部界面上又彼此交融,使用户可以通过增加和修改DLL来实现对系统内部、外部的扩展和升级;同时因为DLL的跨语言特性,内部包含操作界面的DLL可以更为方便地在以后的不同工作、不同语言环境中更好地重复使用。
这一问题的应用较为广泛,但没有充分的资料来帮助解决,经过不断的试验,笔者将初步体会总结出来,用以抛砖引玉。
本文中涉及的主程序和DLL都是在Delphi5.0下实现的,但因为其中所依赖的基础还是Windows本身的窗口机制,所以对于其他的语言平台也有实际意义。
在Delphi中如何创建DLL及输出DLL中的函数有较多资料进行过介绍,在本文中不再赘述,本文只针对DLL中的窗口部分做重点介绍。
2 DLL中自带窗口的创建和显示DLL和普通EXE一样,可以自带窗口,用Delphi设计包含窗口的DLL较其他语言更为方便。
在Delphi的DLL工程中,窗口的生成和编程与普通的EXE工程基本相同,但与EXE文件不同的是:在Delphi的EXE工程中所包含的窗口是自动创建的,而DLL工程中所包含的窗口需要显示创建。
在通常的应用中,DLL将所包含的窗口的创建和显示函数(或过程)输出,由宿主程序根据情况调用将DLL中的窗口显示出来(如点击宿主程序中的某个按钮时显示DLL中的窗口),其窗口创建和显示的过程如下:首先,创建一个DLL工程,并新建一个名为DllForm的Form,可以在该Form上放置任何控件。
Delphi应用程序和DLL的融合(MDI窗口)
Delphi应用程序和DLL的融合(MDI窗口)***********************main (mdi) form***********************unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTShowFrm = procedure(App: TApplication; Scr:TScreen); stdcall;typeTForm1 = class(TForm)Button2: TButton;procedure FormCreate(Sender: TObject);procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure Button2Click(Sender: TObject);privatehInstance: THandle;{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);begintryhInstance := SafeLoadLibrary(‘Mydll.dll‘, SEM_NOOPENFILEERRORBOX);{load the library on form create as will need to know what forms areavailable, so they can be listed for creation.}excepton e: exception do ShowMessage(e.Message);end;end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);begintryif Form1.MDIChildCount = 1 thenbeginMDIChildren[0].Close;end;{This example only uses 1 form in a single dll. In reality would cyclethrough all open children, closing as go}FreeLibrary(hInstance);{destroy reference to dll}excepton e: exception do ShowMessage(e.Message);end;end;procedure TForm1.Button2Click(Sender: TObject);varAFunc: Pointer;begintryPointer(AFunc) := GetProcAddress(hInstance, PChar (‘ShowFrm‘));TShowFrm(AFunc)(Application, Screen);{Open the child form}excepton e: exception do ShowMessage(e.Message);end;end;end.***********************dll file***********************library Mydll;usesSysUtils,Classes,Forms,Windows,Dialogs,MyForm in ‘MyForm.pas‘ {Form2};{$R *.res}varAppDLL: TApplication;ScrDLL: TScreen;procedure MyDLLProc(Reason: Integer);begintryif Reason = DLL_PROCESS_DETACH thenbeginApplication := AppDLL;Screen := ScrDLL;end;excepton e: exception do ShowMessage(e.Message);end;end;procedure ShowFrm(App:TApplication; Scr: TScreen); stdcall; beginApplication := App;Screen := Scr;App.CreateForm(TForm2, Form2);Form2.Show;end;exportsShowFrm;begintryAppDLL := Application;ScrDLL := Screen;DLLProc := @MyDLLProc;excepton e: exception do ShowMessage(e.Message);end;end.***********************mdi-child form***********************unit MyForm;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm2 = class(TForm)procedure FormClose(Sender: TObject; var Action: TCloseAction);private{ Private declarations }public{ Public declarations }end;varForm2: TForm2;implementation{$R *.dfm}procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);begintryAction := caFree;excepton e: exception do ShowMessage(e.Message);end;end;end.主要是,将MDI的父窗口句柄传入.这样就可以正常建立DLL MDI 窗口了.注意.MDI窗口释放的时候,要用 Action:=caFree;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
delphi中dll综合运用的例子(动态加载插件)2008年01月15日星期二 10:591,新建dll客户端模块---------------dll工程文件PlugIns.dll------------------------------- library PlugIns;{ Important note about DLL memory management: ShareMem must be the first unit in your library's USES clause AND your project's (select Project-View Source) USES clause if your DLL exports any procedures or functions that pass strings as parameters or function results. This applies to all strings passed to and from your DLL--even those that are nested in records and classes. ShareMem is the interface unit to the BORLNDMM.DLL shared memory manager, which must be deployed along with your DLL. To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters. }usesSysUtils,Classes,PlugInFrm in 'PlugInFrm.pas' {FrmPlugIns};{$R *.res}//输出接口函数exportsShowDLLForm,GetCaption;beginend.-------------新建模块PlugInFrm.pas的窗体文件---------------unit PlugInFrm;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTFrmPlugIns = class(TForm)Label1: TLabel;private{ Private declarations }public{ Public declarations }end;//定义ShowDLLForm,用于打开本窗体function ShowDLLForm(AHandle: THandle; ACaption: string): Boolean; Stdcall;//输出标题function GetCaption: Pchar; stdcall;implementation{$R *.dfm}//输出标题function GetCaption: Pchar; stdcall;beginResult := '插件演示NO1';end;//打开本窗体function ShowDLLForm(AHandle: THandle; ACaption: string): Boolean; varDLL_Form: TfrmPlugins;beginresult := true;tryapplication.Handle := AHandle; //传递应用程序地址DLL_Form := TFrmPlugins.Create(Application);//创建窗体tryDLL_Form.caption := Acaption;//给窗体标题赋值DLL_Form.ShowModal; //模式显示窗体finallyDLL_Form.Free;end;exceptresult := false;end;end;end.2,新建工程主模块-------------------新建主窗体文件MainFrm.pas--------------unit MainFrm;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, Menus;typeTFrmMain = class(TForm)MainMenu1: TMainMenu;N1: TMenuItem;N2: TMenuItem;N_Plugins: TMenuItem;procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);private{ Private declarations }FForm: TForm;procedure LoadPlugIns; //初始化插件,也就装载插件,并在菜单提供调用procedure PlugInsClick(Sender: TObject); //插件菜单点击事件procedure FreePlugIns; //释放插件public{ Public declarations }end;varFrmMain: TFrmMain;implementation{$R *.dfm}type//定义接口函数类型TShowDLLForm = function(AHandle: THandle; ACaption: string): Boolean; Stdcall;TGetCaption = function: Pchar; StdCall;EDLLLoadError = class(Exception);//定义TTestPlugIn类,存放caption,Address,call等信息TTestPlugIn = classCaption: string;//存取加载后,GetCaption返回的标题Address: THandle; //存取加载DLL的句柄Call: Pointer; //存取ShowDLLForm函数句柄end;varShowDllForm: TShowDllForm; //声明接口函数类型Plugins: TList; //存放每一个DLL加载后的相关信息StopSearch: Boolean;//查找文件,并存于Files中procedure SearchFileExt(const Dir, Ext: string; Files: TStrings);varFound: TSearchRec;Sub: string;i: Integer;Dirs: TStrings;Finished: Integer;beginStopSearch := False;Dirs := TStringList.Create;Finished := FindFirst(Dir + '*.*', 63, Found);while (Finished = 0) and not (StopSearch) dobeginif ([1] <> '.') thenbeginif (Found.Attr and faDirectory = faDirectory) thenDirs.Add(Dir + ) //Add to the directories list.elseif Pos(UpperCase(Ext), UpperCase()) > 0 thenFiles.Add(Dir + );end;Finished := FindNext(Found);end;FindClose(Found);if not StopSearch thenfor i := 0 to Dirs.Count - 1 doSearchFileExt(Dirs[i], Ext, Files);Dirs.Free;end;//初始化插件,也就装载插件,并在菜单提供调用procedure TfrmMain.LoadPlugIns;varFiles: TStrings;i: Integer;TestPlugIn: TTestPlugIn;NewMenu: TMenuItem;GetCaption: TGetCaption;beginFiles := TStringList.Create;Plugins := TList.Create;//查找指定目录下的.dll文件,并存于Files对象中SearchFileExt(ExtractFilepath(Application.Exename), '.dll', Files); //加载查找到的DLLfor i := 0 to Files.Count - 1 dobeginTestPlugIn := TTestPlugIn.Create;TestPlugIn.Address := LoadLibrary(PChar(Files[i]));if TestPlugIn.Address = 0 thenraise EDLLLoadError.Create('装载' + PChar(Files[i]) + '失败');try@GetCaption := GetProcAddress(TestPlugIn.Address,'GetCaption');TestPlugIn.Caption := GetCaption;TestPlugIn.Call := GetProcAddress(TestPlugIn.Address,'ShowDLLForm');PlugIns.Add(TestPlugIn);//创建菜单,并将菜单标题,Onclick事件赋值NewMenu := TMenuItem.Create(Self);NewMenu.Caption := TestPlugIn.Caption;NewMenu.OnClick := PlugInsClick;NewMenu.Tag := i;N_plugins.Add(NewMenu); //每次在菜单下新增一个模块菜单 exceptraise EDLLLoadError.Create('初始化失败');end;end;Files.Free;end;//插件菜单点击事件procedure TfrmMain.PlugInsClick(Sender: TObject);begin//根据菜单的tag属性对应函数调用的地址@showDllForm := TTestPlugIn(PlugIns[TMenuItem(Sender).Tag]).Call;//执行showDllForm函数if not showDllForm(application.Handle,TTestPlugIn(PlugIns[TMenuItem(Sender).Tag]).caption) then showmessage('打开窗体错误');end;//释放插件procedure TfrmMain.FreePlugIns;vari: Integer;begin//将加载的插件全部释放for i := 0 to PlugIns.Count - 1 dobeginFreeLibrary(TTestPlugIn(PlugIns[i]).Address);end;//释放plugIns对象PlugIns.Free;end;procedure TfrmMain.FormCreate(Sender: TObject);beginLoadPlugIns;end;procedure TfrmMain.FormDestroy(Sender: TObject);beginFreePlugins;end;end.-------------------------end-----------------------类别:Delphi | | 添加到搜藏 | 分享到i贴吧 | 浏览(1342) | 评论(2)上一篇:统计每天数据的变化量下一篇:基于Delphi的融合DLL中的窗口最近读者:登录后,您就出现在这里。