我使用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之外,无论如何都要从Package1.bpl调用类似Case1的TestProc吗?
答案 0 :(得分: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);
答案 1 :(得分:0)
对于案例2,您还可以简单地使用运行时包构建项目,并在项目的运行时包列表中包含Package1(在Project Options \ Packages \ Runtime包中)。然后你可以删除导入(external
声明)并只使用包含该函数的单元。