我使用Delphi,我有以下设置:
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;Case 1和Case 3通过了,但Case 2将引发访问冲突。
我的问题如下,
的Package1.bpl调用TestProc吗?
发布于 2011-05-26 03:06:11
是的,支持用例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);发布于 2011-05-26 07:02:03
对于案例2,您也可以简单地使用运行时包构建项目,并将Package1包含在项目运行时包列表中(在project \ packages \中)。然后可以删除导入(external声明),只需使用包含该函数的单元。
https://stackoverflow.com/questions/6132993
复制相似问题