gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:06:18 24 4
gpt4 key购买 nike

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

最佳答案

似乎只有一种方法可以做到这一点 - 创建回调对象。在您的应用程序中,您必须声明接口(interface),它描述您的方法,例如:

IMyMethodInterface = interface(IInterface)
procedure MyMethod(); stdcall;
end;

接下来你必须创建类,它实现这个接口(interface)(和你的方法):

TMyMethodObject = class(TInterfacedObject, IMyMethodInterface)
public
procedure MyMethod(); stdcall;
end;

当你加载DLL时,你必须创建TMyMethodObject实例并将其IMyMethodInterface传递给dll;当然dll必须有相应的方法并导出它(以接口(interface)作为参数)SetMethodCallback存储接口(interface)引用:

变量:

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.

请注意,在将 dll 中的 AppMethod 设置为 nil< 之前,您的 mmo 对象 (TMyMethodInterface) 不会被销毁 (或 FreeLibrary dll ),所以要小心

关于delphi - 从 dll 调用主应用程序中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9736317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com