无法从bpl调用exports函数

时间:2011-05-26 02:10:26

标签: delphi delphi-xe

我使用Delphi XE,我有以下设置:

Mydll.dll Package1.bpl (运行时包)都包含Unit3.pas

unit Unit3;

interface

implementation

uses Dialogs;

procedure TestProc(const S: string); stdcall;
begin
  MessageDlg(S, mtInformation, [mbOK], 0);
end;

exports TestProc;

end.


案例1:

procedure TestProc(const S: string); stdcall; external 'mydll.dll';

procedure TForm1.Button3Click(Sender: TObject);
begin
  TestProc('Button3');
end;


案例2:

procedure TestProc(const S: string); stdcall; external 'Package1.bpl';

procedure TForm1.Button3Click(Sender: TObject);
begin
  TestProc('Button3');
end;


案例3:

procedure TForm1.Button3Click(Sender: TObject);
var H: THandle;
    P: procedure(const S: string); stdcall;
begin
  H := LoadPackage('Package1.bpl');
  try
    @P := GetProcAddress(H, PChar('TestProc'));
    if Assigned(P) then
      P('Button3');
  finally
    UnloadPackage(H);
  end;
end;


案例1 案例3通过案例2 引发访问冲突


我的问题如下,

1。案例2不受支持?
2。除了案例3之外,无论如何都要从Package1.bpl调用类似Case1的TestProc吗?

2 个答案:

答案 0 :(得分:3)

是支持案例2,但您也必须调用LoadPackage函数才能将软件包加载到内存中。

试试这段代码

procedure TestProc(const S: string); stdcall;  external 'Package1.bpl';


var
  hPackage : Cardinal;

procedure TForm1.Button1Click(Sender: TObject);
begin
   TestProc('Button3');
end;


initialization
  hPackage := LoadPackage('Package1.bpl');
finalization
  if hPackage<>0 then 
  UnloadPackage(hPackage);

答案 1 :(得分:0)

对于案例2,您还可以简单地使用运行时包构建项目,并在项目的运行时包列表中包含Package1(在Project Options \ Packages \ Runtime包中)。然后你可以删除导入(external声明)并只使用包含该函数的单元。