从dll调用主应用程序中的方法

时间:2012-03-16 11:20:18

标签: delphi dll

我可以从dll代码中调用放在主应用程序中的方法吗?

1 个答案:

答案 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)不会被销毁,所以要小心