我使用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之外,是否还有类似Case1的方法从Package1.bpl调用TestProc?
最佳答案
是的,支持案例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);
关于delphi - 无法从bpl调用导出功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6132993/