Delphi 我可以使用类型声明函数吗
我有一个程序,可以使用五个DLL的任意组合来做一些工作。所有DLL都有相同的接口、相同的导出函数和过程,只是它们的实际功能有所不同 为了使事情变得更简单,明智的检查,我只想定义一次函数,然后在任何东西之间共享定义单元。然后,问题将是定义给定类型的函数 想象一下:Delphi 我可以使用类型声明函数吗,delphi,Delphi,我有一个程序,可以使用五个DLL的任意组合来做一些工作。所有DLL都有相同的接口、相同的导出函数和过程,只是它们的实际功能有所不同 为了使事情变得更简单,明智的检查,我只想定义一次函数,然后在任何东西之间共享定义单元。然后,问题将是定义给定类型的函数 想象一下: type TMyFunc = function(inP : Integer): outP : Boolean; 我现在可以定义一个名为doit的函数,比如说,doit,并强制其定义为TMyFunc类型,而不必重新定义所有内容吗 我
type
TMyFunc = function(inP : Integer): outP : Boolean;
我现在可以定义一个名为doit的函数,比如说,doit
,并强制其定义为TMyFunc
类型,而不必重新定义所有内容吗
我不能只是打字:
function doit: TMyFunc;
有没有办法做到这一点
这将使定义一切变得更容易、更安全等等
现在,所有内容都被定义了好几次,在某一点上进行必要的接口更改意味着我需要记住去任何地方复制更改(复制是不好的)。如果我只能在一个地方进行声明,那么如果我忘记在某个地方进行更改,编译就会失败,这将是非常棒的
有没有办法做到这一点
答案很简单,不,你不能这么做。声明函数时,必须包含其完整的参数列表、返回类型等。这是错误的:
type
TMyFunc = function(inP : Integer): outP : Boolean;
函数不能有两种返回类型(输出和布尔)
相反:
type
outP = Longint; // or whatever you want outP to be.
TMyFunc1 = function (inP : Integer): outP;
TMyFunc2 = function (inP : Integer): Boolean;
现在可以定义一个名为doit1的函数变量,并强制其定义为TMyFunc1类型。类似地:doit2是TMyFunc2类型
var
doit1 : TMyFunc1;
doit2 : TMyFunc2;
如果您有以下功能:
const
DllName1 = 'MyFirstDLL.DLL';
DllName2 = 'MySecondDLL.DLL';
function TestFunc1(inP : Integer): outP; external DllName1;
function TestFunc2(inP : Integer): Boolean; external DllName2;
然后可以将这些函数分配给占位符doit1、doit2:
procedure AssignPlaceholders;
begin
doit1 := TestFunc1;
doit2 := TestFunc2;
end;
注意:必须声明与实际函数完全相同的占位符类型(TMyFunc1、TMyFunc2),包括stdcall、cdecl等说明符
调用AssignPlaceholder后,可以像调用任何其他函数一样调用doit1和/或doit2。为什么不创建一个公共单元,在每个项目之间共享?我有几个项目,其中有许多DLL共享相同的定义,我只定义了一次。没有必要为每个DLL重写所有内容。我认为您正在寻找错误的问题解决方案。当我在DLL中声明函数时,这实际上没有帮助,我必须手动确保它们尊重接口,否则调用函数将中断。很遗憾我不能集中精力也许我只是没有足够的信息来了解你到底在做什么。但肯定有更好的解决办法。当然,每个DLL的
实现
是不同的,但是接口
应该是相同的。我在三个DLL中声明了这个确切的函数。我想要一种方法,将函数描述声明为一个类型,然后引用这个类型作为实际的函数声明,从而确保三个DLL上的接口是相同的,以防我需要在某个时候更改某些内容,而忘记在三个不同的位置更改它<代码>函数getFile(jobName:STRING;fileName:STRING;engineParams:TStringList;fileContent:TStream;isCatalogueFile:Boolean=false):字符串代码>阻止您使用单元声明和定义导出函数的原因。在单元的接口部分添加inlcude文件。将此单元添加到库中。您可以将exports
-子句放在include文件、unit或library-project-file中。谢谢,这就是我想的……我一直希望:)