无法从bpl调用导出功能

| 我使用的是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之外,是否还有类似Case1的方法从Package1.bpl调用TestProc?     
已邀请:
是的,支持案例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);
    
对于情况2,您也可以仅使用运行时程序包构建项目,并将Package1包含在项目的运行时程序包列表中(在Project Options \\ Packages \\ Runtime程序包中)。然后,您可以删除导入(
external
声明),而仅使用包含函数的单位。     

要回复问题请先登录注册