本帖最后由 baiylhnh 于 2013-01-26 19:40:17 编辑

解决方案 »

  1.   

    Getfun 是一个函数类型。fun 是此函数类型的变量,在这里就相当于函数名称了,所以后面的 fun(2, 2) 等于调用了这个函数。@fun 是这个函数的地址,给 @fun 赋值等于这个函数有了实例。在赋值之前调用 fun(2, 2) 要出不可预知的严重错误,所以调用前要用 if Assigned(@Fun) 来检查赋值是否成功。如果用 C++ 写,就没这么多事,甭管什么地址,直接用就行。Pascal 是强类型语言,编译器要对所有变量做类型检查,这样很多错误在编译期间就能发现,免得在运行时出错搞得一头雾水,但也让 C++ 码农对 Delphi 的类型定义很不适应。
      

  2.   

    你说的我都知道.就是不明白什么意思嘛
    1函数类型是个什么类型.有什么用
    2@fun 是这个函数的地址 ,我用其它地址不行么.比如自定义的pointer
      

  3.   

    楼主:你大概比较熟悉 C++ 编程,对 Delphi 这一套不习惯。再解释一下。你调用的是 DLL 函数,Delphi 在调用前必须知道此函数有哪些参数,返回值是什么,怎么知道?你必须先定义一个函数类型,从而告诉 Delphi 这些(其实 C++ 也需要这种定义,只是定义方式不同)。你当然可以把 getprocaddress(DllHandle,'myfun') 返回的函数地址赋值给一个 Pointer 类型的变量,但是你不能直接用这个 Pointer 变量当函数来调用,因为 Delphi 不知道函数的参数和返回值是如何定义的。所以,你还是要把这个地址赋值给 @fun,然后调用 fun 才行。fun 这个名字无所谓,你可以叫做 myfun 或别的什么名字,关键是前面的函数类型定义要和 dll 中的实际函数一致才行。你不妨把那个函数定义(function(x, y: Integer): dword; stdcall; ),修改一下,例如,去掉一个参数,程序肯定会出错。编译时就会报错:函数调用和函数定义不符。你不妨在调用时也去掉一个参数(变成 fun(2)),编译时不出错了,dll 运行时会出错:因为少往堆栈压入一个参数,整个堆栈都会乱套,可能会是很严重的错误。