咖猫 發表於 2017-9-3 16:25:54

Delphi 用DLL实现插件的简单实例

<p><strong>Delphi 用DLL实现插件的简单实例</strong></p>
<p>这是DLL的代码&nbsp;&nbsp;<br />
</p>
<p>实现代码:&nbsp; <br />
</p>
<div class="jb51code">
<pre class="brush:delphi;">
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}

begin
end.
</pre>
</div>
<p>这是调用窗体的代码&nbsp; <br />
</p>
<p>本例只使用了一个DLL,所以当有多个DLL时,需要循环DLL所在目录,依次加载DLL&nbsp;&nbsp;<br />
</p>
<div class="jb51code">
<pre class="brush:delphi;">
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 &lt;&gt; nil then
showinfo(PWideChar(TMenuItem(Sender).Caption)); //执行DLL中的ShowInfo
end;

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 &lt;&gt; 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.
</pre>
</div>
<p>如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Delphi 根据字符串找到函数并执行的实例</li><li>Delphi 中内存映射对于大文件的使用</li><li>Delphi提取PDF文本实例</li><li>Delphi XE5 为Android应用制作签名的方法(图文)</li><li>ListView 百分比进度条(delphi版)</li><li>Delphi实现截屏存盘的方法</li><li>Delphi实现窗体感知鼠标滑过并自动隐藏与显示窗口的方法</li><li>Delphi 实现软件自动升级的功能</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Delphi 用DLL实现插件的简单实例