我有一个程序,可以使用五个DLL的任意组合来完成某些工作。所有DLL具有相同的接口,相同的导出函数和过程,只是它们的实际作用不同。
为了简化操作,我想只定义一次函数,然后在任何东西之间共享定义单元。那么问题就是要定义给定类型的函数。
想象:
type
TMyFunc = function(inP : Integer): outP : Boolean;
我现在可以定义一个名为doit
的函数,并强制其定义为TMyFunc
类型,而无需重新定义所有内容吗?
我不能只输入:
function doit: TMyFunc;
有什么办法吗?
这确实会使定义一切变得更容易,更安全等。
现在,所有内容都定义了多次,并且一次更改了必要的接口意味着我需要记住到处去重复更改(重复是不好的)。如果我只能在一个地方进行声明,那么如果我忘记进行更改,则编译会失败,那就太好了。
答案 0 :(得分:1)
有什么办法吗?
答案很简单,不,您不能这样做。声明函数时,必须包括其完整的参数列表,返回类型等。
答案 1 :(得分:0)
这是错误的:
type
TMyFunc = function(inP : Integer): outP : Boolean;
一个函数不能有两种返回类型(outP和Boolean)!
INSTEAD:
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等说明符。
在调用AssignPlaceholders之后,您可以像其他任何函数一样调用doit1和/或doit2。