我使用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);

关于delphi - 无法从bpl调用导出功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6132993/

10-10 16:55