0

我目前正在研究一些插件概念,并且在我研究使用 dll 或 BPls 的过程中遇到了,我现在决定使用 bpls。

我想知道什么时候必须使用 UnloadPackage(包模块);最好的视图,因为加载后立即给我带来什么,因为形状然后立即消失

当前的程序结构

Hostapplication(PackageLoader.exe)
                |_Plugin.bpl
                 |_TPluginForm

在此处输入图像描述

包加载器.exe

var
  PackageModule : hModule;
  createProc: Procedure;
begin
  // Package laden
  try
  PackageModule := LoadPackage('plugin.bpl');
  If PackageModule <> 0 then
  begin
    @createProc := GetProcAddress( PackageModule, 'CreatePluginForm' ); // Funktion aus den Exports aufrufen
    if Assigned(CreateProc) then
      CreateProc
    else
      ShowMessage('GetProcAddress failed');
  end;
  finally
    //UnloadPackage(PackageModule);
  end;
end;

在此处输入图像描述

plugin.bpl - uPlugin.pas

unit uPlugin;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TPluginForm = class(TForm)
    Memo1: TMemo;
    Panel1: TPanel;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  PluginForm: TPluginForm;
  Status: Boolean;

implementation


uses
  uRandomString;

{$R *.dfm}

procedure TPluginForm.Button1Click(Sender: TObject);
var
  User, pwd, mail: String;
  ul, pl, ml: Integer;
begin
  Status := True;
  ul := StrToInt(Edit1.Text);
  pl := StrToInt(Edit2.Text);
 // ml := StrToInt(Edit3.Text);
  while Status do
  begin
    Application.ProcessMessages;
    User := RandomString(ul);
    pwd := RandomString(pl);
    //mail := RandomString(ml) + '@' + RandomString(5)+'.de';

    Memo1.Lines.Add(User+':'+pwd); //+':'+mail);
  end;
end;

procedure TPluginForm.Button2Click(Sender: TObject);
begin
  Status := False;
end;

function CreatePluginForm(ApplicationHandle, ParentHandle: THandle): boolean;
begin
  Result := False;
  PluginForm := TPluginForm.Create(nil);
  try
    PluginForm.Show;
    //PluginForm.ShowModal;
  finally

  end;
end;


exports
  CreatePluginForm;

initialization
  RegisterClass(TPluginForm);

finalization
  UnRegisterClass(TPluginForm);

end.
4

1 回答 1

2

何时卸载包取决于您的应用程序的设计。鉴于我们对此知之甚少,因此很难给出具体建议。一种选择是不卸载包。为什么你觉得你需要这样做?如果需要卸载,您必须确保包中没有代码仍在运行。您展示了包裹中的表格。在您卸载包裹时,该表格必须已销毁。

我可以看到的大问题是您导入该功能的方式。它在包中是这样声明的:

function CreatePluginForm(ApplicationHandle, ParentHandle: THandle): Boolean;
begin
  ....
end;

exports
  CreatePluginForm;

然后你像这样导入它:

var
  createProc: Procedure;
....
@createProc := GetProcAddress(PackageModule, 'CreatePluginForm');
if Assigned(CreateProc) then
  CreateProc

您需要createProc使用匹配的签名声明:

var
  createProc: function(ApplicationHandle, ParentHandle: THandle): Boolean;

然后当你调用它时,你需要传递两个句柄,并对返回值做一些事情。

您的代码也会泄漏PluginForm

最后,THandle似乎是错误的类型。我想你的意思是使用HWND. 虽然我不明白你为什么不传递 VCL 对象。毕竟,您选择使用包,这意味着您可以直接传递父控件。而且您当然不需要传递与应用程序相关的任何内容,因为插件已经可以看到应用程序。

于 2014-12-10T13:25:39.633 回答