声明中 type 类 = 函数 (参数);怎么理解?(100分)

  • 主题发起人 主题发起人 cn01574978
  • 开始时间 开始时间
C

cn01574978

Unregistered / Unconfirmed
GUEST, unregistred user!
在看DELPHI下深入windows编程的书遇到看不懂的问题在下面:
又看了几本基础的书 可是没有找到合适的答案。
例如:
......
hook:array[0..4]of THookClass;
.....
function NewCreateFileA(lpFileName: PChar;dwDesiredAccess, dwShareMode: DWORD;
lpSecurityAttributes: PSecurityAttributes;dwCreationDisposition,dwFlagsAndAttributes: DWORD;
hTemplateFile: THandle): THandle;stdcall;
type
TCreateFileA=function(lpFileName: PChar;dwDesiredAccess, dwShareMode: DWORD;
lpSecurityAttributes: PSecurityAttributes;dwCreationDisposition,dwFlagsAndAttributes: DWORD;
hTemplateFile: THandle): THandle;stdcall;

begin
Hook[0].Restore
{改引入表式可以不使用此语句}
result:=TCreateFileA(hook[0].OldFunction)(lpFileName,dwDesiredAccess,dwShareMode,
lpSecurityAttributes,dwCreationDisposition,dwFlagsAndAttributes,
hTemplateFile)
这里是TCreateFileA用法
end;

下面是 Restore 的过程:
{恢复系统函数的调用}
procedure THookClass.Restore;
var
nCount: DWORD;
BeenDone: TList;
begin
if Trap then{如果是陷阱式}
begin
if (not AlreadyHook) or (hProcess = 0) or (OldFunction = nil) or (NewFunction = nil) then
exit;
WriteProcessMemory(hProcess, OldFunction, @(Oldcode), 5, nCount);
AlreadyHook:=false;{表示退出HOOK}
end
else begin{如果是改引入表式}
if (not AllowChange)or(OldFunction=nil)or(NewFunction=nil)then exit;
BeenDone:=TList.Create;{用于存放当前进程所有DLL模块的名字}
try
PatchAddressInModule(BeenDone,GetModuleHandle(nil),NewFunction,OldFunction);
finally
BeenDone.Free;
end;
end;
end;

下画线的一段 type 下面的声明 怎么是 类 和 函数的关系?
能详细解释一下吗?中文的。
谢谢谢谢各位了。
 
type定义的不一定就是类,在这里,定义了一个函数类型
下面的TCreateFileA(hook[0].OldFunction)就是把hook[0].OldFunction强制转换成这个类型的函数并调用
 
你好 谢谢你的回答
你能说的在详细点吗?
具体这种函数类型怎么定义?
怎么使用?
能给个例子吗?
谢谢谢谢啦
 
你好 根据你的提示,找到了一些资料.
这里再次谢谢你,现将分数发放.
另外:将我找到的资料贴出来,供大家学习.

什么是过程类型
把一个变量声明为过程类型,可以把一个过程或函数作为一个整体赋给这个变量或者把这个变量作为参数传递给其它过程或函数。

声明一个过程类型的语法同声明一个过程或函数的首部语法相似,不同的是在保留字Procedure或fun- ction后不需要有过程或函数的标识符,中国自学编程网首发,例如:

Type
Proc1=Procedure

Proc2=Procedure(VarX,Y:integer)

Proc3=Function(X:Double):Double


上例中,声明了三个过程类型,第一个是不带任何参数的过程,第二个是带两个参数的过程,第三个是带一个Double类型的参数并返回Double类型值的函数。

同声明一个过程或函数一样,您在声明一个过程类型时可以指定一种调用约定方式,缺省就是Register方式。

下面我们举例说明过程类型的用法:

Type
SwapProc=Procedure(Var X,Y:Integer)

MathFunc=Function(X:Double):Double


{以上是类型声明部分}

Var
P:SwapProc

F:MathFunc


{以上把P说明为SwapProc 类型的变量,把F说明为MathFunc类型的变量}

Procedure Swap(var A,B:integer)

Var
Temp:Integer

Begin
Temp:=A

A:=B

B:=Temp

End


Function Tan(Angle:Double)

Begin
Tan:=Sin(Angle)/Cos(Angle)

End


{以上定义了一个过程和一个函数}


P:=Swap

F:=Tan


{以上把Swap过程赋给P变量,把Tan函数赋给F变量}


P(I,J)
{相当于调用Swap(I,J)}
X:=F(X)
{相当于X:=tan(X)}
这里举例说明了一个过程或函数可以赋给一个过程类型的变量,事实上过程类型的数据还可以作为参数传递给其它过程或函数。

注意:不能把过程类型直接作为函数的返回类型,不过您可以让函数的返回类型为指针类型,让指针指向一个过程或函数的地址。

当把一个过程或函数赋给一个过程类型的变量时要注意赋值相容,只有满足下列条件才是赋值相容的。 调用约定方式必须相同。

参数个数必须相同,相应的其数据类型必须相同,但参数名不一定必须相同。

函数的返回类型必须相同。

Object Pascal规定,nil同任何过程类型相容。

过程类型根据其是否运用于对象分为两大类:一类是全局过程指针,另一类是方法指针。

全局过程指针指向的是全局的过程或函数,例如上例中的SwapProc和MathFunc,这类过程类型在声明没有Of object 部分。

方法指针在明时必须加上Of object,表示它所指向的是一个对象的方法,程序示例如下:

Type
TNotifyEvent=Procedure (Sender:Tobject) Of Object


有了方法指针后,要扩展一个对象,不需要重新派生出一个新的,只要把其它对象的方法赋给个这个方法指针就可以了,这样可以避免对象的层次过多,www.k8w.net 。

方法指针通常用于把对象的事件同一段已有的代码(可能是其它对象的)相联系起来,例如您想定义用户单击按钮时的缺省行为,您不必从 Tbutton对象派生出一个新对象并重载它的响应单击的行为, 您只需要把一段已有的代码同一个方法指针联系起来。

方法指针的示例如下:

Type
TNotifyEvent=Procedure(Sender:Tobject) Of Object

Type
TAnObject=Class(TObject)
FOnClick:TNotifyEvent

End

TAnOtherObject=Class(TObject)
Procedure AMethod(Sender:Tobject)

end

Var
AnObject:TAnObject

您现在的位置:首页--开发语言--DELPHI编程--DELPHI基础--浏览文章
delphi过程类型基础学习

点击:220 发布日期:2007-11-27 20:07:24 进入论坛


AnOtherObject:TAnotherObject

Begin
AnObject:=TAnobject.Create

AnotherObject:=TAnotherObject.Create

AnObject.FOnClick:=AnotherObject.Amethod

end;
 
后退
顶部