Delphi가 DLL로 플러그인을 구현하는 간단한 사례

2772 단어 DelphiDLL
Delphi가 DLL로 플러그인을 구현하는 간단한 사례
이것은 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} 
 
begin 
end. 
이것은 창을 호출하는 코드입니다
이 예제에서는 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 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 <> 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. 
궁금한 점이 있으면 메시지를 남기거나 본 사이트 지역사회에 가서 토론하세요. 읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기