主页 > 编程资料 > Delphi >
发布时间:2015-09-22 作者:网络 阅读:182次

这是DLL的代码
library MyDll;
uses  SysUtils,  Dialogs,  Classes;
procedure ShowInfo(info:PChar);stdcall;begin  ShowMessage('您选择了【'+info+'】');end;
function GetCaption:Pchar;begin  Result := '中国';end;
exports ShowInfo,                GetCaption;
{$R *.res}
beginend.


这是调用窗体的代码本例只使用了一个DLL,所以当有多个DLL时,需要循环DLL所在目录,依次加载DLL
unit Main;
interface
uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, Menus, ExtCtrls;
type  TShowInfo = procedure (info:PChar);stdcall;  TGetCaption = function : PChar;stdcall;

  TForm1 = class(TForm)    Button1: TButton;    Button2: TButton;    MainMenu1: TMainMenu;    Image1: TImage;    procedure Button2Click(Sender: TObject);  private    { Private declarations }    FHandel : THandle;     //DLL句柄    FProAddress: Pointer;  //DLL中ShowInfo的地址    showinfo: TShowInfo;   //为动态加载DLL而设    procedure LoadPlusIn;  //加载插件(DLL)    procedure ItemClick(Sender: TObject);   //自定义菜单点击事件  public    { Public declarations }  end;
var  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);begin  LoadPlusIn;end;
procedure TForm1.ItemClick(Sender: TObject);begin  @showinfo := FProAddress;     //取地址  if @showinfo <> nil then    showinfo(PWideChar(TMenuItem(Sender).Caption));  //执行DLL中的ShowInfoend;
procedure TForm1.LoadPlusIn;var  getcaption: TGetCaption;  item : TMenuItem;begin  FHandel := LoadLibrary('MyDll.dll');   //加载  if FHandel = 0 then  begin    ShowMessage('加载失败!');    Exit;  end  else  begin    @getcaption := GetProcAddress(FHandel,'GetCaption');    //取DLL中GetCaption地址    if @getcaption <> nil then    begin      item := TMenuItem.Create(MainMenu1);    //创建一个菜单      item.Caption := getcaption;             //取Caption,即调用DLL中的GetCaption      FProAddress := GetProcAddress(FHandel,'ShowInfo');  //取得DLL中ShowInfo的地址      item.OnClick := ItemClick;              //赋予菜单项的点击事件      MainMenu1.Items.Add(item);              //添加到主菜单    end;
  end;end;
end.


关键字词: