はBPL

2011-05-26 9 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:3渡さしかしケース2ます

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ケースアクセス違反を発生させます。


以下のように私の質問は、

1ケース2はサポートされていませんか?
2.ケース3を除いて、Case1と同様のPackage1.bplからTestProcを呼び出すことはありますか?

答えて

3

はいケース2がサポートされていますが、LoadPackage関数を呼び出してメモリにパッケージを読み込む必要があります。

あなたはまた、単に実行時パッケージを使ってプロジェクトをビルドし、(プロジェクトの実行時パッケージのリストにパッケージ1を含むことができ、ケース2の場合、このコード

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

を試みるプロジェクトオプション\パッケージ\ランタイムパッケージで)。次に、インポート(external宣言)を削除し、その機能を含むユニットを使用するだけです。

+0

解決に感謝します。 – lmengyew