Невозможно вызвать функцию экспорта из bpl - PullRequest
3 голосов
/ 26 мая 2011

Я использую 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, есть ли способ вызвать TestProc из Package1.bpl, аналогичный Case1?

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

Да, вариант 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);
0 голосов
/ 26 мая 2011

В случае 2 вы также можете просто построить свой проект с помощью пакетов времени исполнения и включить Package1 в список пакетов времени исполнения для вашего проекта (в разделе Параметры проекта \ Пакеты \ Пакеты времени выполнения). Затем вы можете удалить импорт (external декларация) и просто использовать модуль, содержащий функцию.

...