我可以从dll代码中调用放在主应用程序中的方法吗?
答案 0 :(得分:5)
似乎只有一种方法 - 创建一个回调对象。 在你的应用程序中,你必须声明接口,它描述了你的方法,例如:
IMyMethodInterface = interface(IInterface)
procedure MyMethod(); stdcall;
end;
接下来你必须创建类,它实现了这个接口(和你的方法):
TMyMethodObject = class(TInterfacedObject, IMyMethodInterface)
public
procedure MyMethod(); stdcall;
end;
加载DLL时,必须创建TMyMethodObject
实例并将其IMyMethodInterface
传递给dll;当然dll必须有相应的方法并导出它(以接口作为参数)SetMethodCallback
存储接口参考:
乏:
var mmo : IMyMethodInterface;
dllHandle : THandle;
smc : procedure (mmi : IMyMethodInterface); stdcall;
代码:
mmo := TMyMethodObject.Create();
dllHandle := LoadLibrary('mydll.dll');
smc := GetProcAddress(dllHandle, 'SetMethodCallback');
if assigned(smc) then
smc(mmo);
现在,您可以在dll中使用IMyMethodInterface引用来调用方法。
当然你可以静态链接dll并直接使用它:
procedure SetMethodInteface(mmi : IMyMethodInterface); stdcall; external 'mydll.dll';
这是一个DLL示例代码:
library Project3;
// uses YourMethodIntf.pas
{$R *.res}
var AppMethod : IMyMethodInterface;
procedure SetAppMethodCallback(mmi : IMyMethodInterface); stdcall;
begin
AppMethod := mmi;
end;
procedure AnotherDllMethod();
begin
//here you can use AppMethod.MyMethod();
end;
exports
SetAppMethodCallback name 'SetMethodcallback';
begin
end.
考虑到在将{d}中的mmo
设置为TMyMethodInterface
(或FreeLibrary dll)之前,您的AppMethod
对象(nil
)不会被销毁,所以要小心