2011-05-26 2 views
3

Я с помощью 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?

ответ

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); 
+0

Спасибо за решение. 1-е решение повысит нарушение доступа, если нажать кнопку 2-го раза, но 2-е решение отлично работает независимо от того, сколько раз я нажимаю кнопку. – lmengyew

+1

@lmengyew Я удаляю первое решение (и просто держу второе). исключение исключения доступа было поднято в строке 'LoadPackage', потому что пакет уже загружен во второй раз, который вы его вызываете. – RRUZ

0

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

+0

Спасибо за решение. – lmengyew