2011-05-26 54 views
3

調用出口功能我用Delphi XE,我已經以下設置:無法從BPL

兩個MYDLL.DLLPackage1.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.除Case 3之外,是否還有類似於Case1的從Package1.bpl中調用TestProc?

回答

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

感謝您的解決方案。如果第二次點擊按鈕,第一種解決方案會引發訪問衝突,但無論點擊多少次,第二種解決方案都能正常工作。 – lmengyew 2011-05-26 03:26:35

+1

@lmengyew我刪除了第一個解決方案(只保留第二個)。 「LoadPackage」行中引發了Access Violation異常,因爲該包已經第二次加載了。 – RRUZ 2011-05-26 03:49:37

0

對於案例2,你也可以只簡單地運行時包建立你的項目,包括在運行時軟件包中爲您的項目清單包1(在項目選項\包\運行包)。然後您可以刪除導入(external聲明),並使用包含該功能的單位。

+0

感謝您的解決方案。 – lmengyew 2011-05-26 07:37:00