gpt4 book ai didi

delphi - Delphi:使.dll导出通过type关键字声明的方法

转载 作者:行者123 更新时间:2023-12-03 19:51:28 26 4
gpt4 key购买 nike

我有一个用Delphi编写的库L,它使用方法M。程序P使用库L的方法M。

L看起来像这样:

library L;

// uses and stuff ...

function M(i: Integer; k: Integer): Integer stdcall;
begin
Result := i*k;
end;

exports
M;

begin
end.


P看起来像这样:

// uses and begin and class and stuff ...

type
TTheMethod = function(i: Integer; k: Ineteger): Integer stdcall;

var
hLib: THandle;
methodVar: TTheMethod;
a: Iteger;
begin
hLib := LoadLibrary(PWideChar('someFile.dll'));
methodVar:= GetProcAddress(hLib, 'M');
a := methodVar(2, 21);


如果我将库更改为M期望3个整数,则程序P仍将编译。 Delphi不知道M和methodVar是否具有相同的类型。如果M和methodVar中只有一个更改了类型,我希望编译器失败。

我试图将库更改为:

function _M(i: Integer; k: Integer): Integer stdcall;
begin
Result := i*k;
end;

var
M: TTheMethodA = _M;

exports
M;


但这不会编译。

我能以某种方式让编译器为我检查类型吗?

最佳答案

我能以某种方式让编译器为我检查类型吗?


你不能。编译器根本无法验证外部函数的签名。实际上,从DLL导出的函数不包含任何元数据来标识其签名。

与此最接近的是C ++名称修饰,它以修饰的名称编码功能的签名。但是,这对您没有用,因为Delphi没有任何名称处理功能。



至于您的代码,您不能导出过程类型的变量。您必须导出实际功能。您可以这样编写最后的代码:

function _M(i: Integer; k: Integer): Integer stdcall;
begin
Result := i*k;
end;

function M(i: Integer; k: Integer): Integer stdcall;
begin
Result := _M(i, k);
end;

exports
M;


或者,如果您希望通过变量灵活地进行路由,则可以通过类似的方式进行:

var
_M: function(i: Integer; k: Integer): Integer stdcall;
// something must assign to _M at some point!

function M(i: Integer; k: Integer): Integer stdcall;
begin
Result := _M(i, k);
end;

exports
M;

关于delphi - Delphi:使.dll导出通过type关键字声明的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31262547/

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