function TForm_Main.Perform_SysDLL(Const Tel, SysFrame: string;
  var DataFrame: string): integer;
var
  iResult:       integer;
  ParseSysFrame: TParseSysFrame; //in SysSMS.DLL
begin
  Try
    Result := 0;
    @ParseSysFrame := GetProcAddress(G_SysLibHandle, 'ParseSysFrame');    if not (@ParseSysFrame = nil) then begin
      iResult := ParseSysFrame(Tel, SysFrame, DataFrame);
      case iResult of
        2: Result := 1;
        1: ShowStr('数据解析成功');
        0: ShowStr('设备无权限发送系统数据帧');
        -1:ShowStr('错误的帧格式');
        -2:ShowStr('错误的命令字');
      end;
    end;// if not (@ParseSysFrame = nil) then begin
  except
    on E:Exception do ShowStr(E.Message);
  end;
end;
大家看这一段代码中。我动态调用了一个DLL后。在把DLL库中函数的地址传递给程序中时。我看人家是这样写的。可是我不明白这里的:ParseSysFrame和@ParseSysFrame的关系是怎么样的?为什么有这样的写法:@ParseSysFrame := GetProcAddress(G_SysLibHandle, 'ParseSysFrame');啥意思?用面向对象的思想解释是如何好像解释不通。

解决方案 »

  1.   

     ParseSysFrame: TParseSysFrame; 知道ParseSysFrame的类型。而你的GetProcAddress(G_SysLibHandle, 'ParseSysFrame')返回的是一个地址,所以要把这个地址赋给ParseSysFrame的地址也就是@ParseSysFrame。你都知道是把DLL库中函数地址传递给程序了,就是这句实现的。
      

  2.   

    TScrollBox里放一个TIMAGE控件,当TScrollBox有滚动条时,怎么选择图片中的一部分,但这部分包括显示和没被显示的部分!
    就想网页中选择文本一样,当选择超过显示部分时,滚动条自动往下滚!
      

  3.   

     (@ParseSysFrame = nil) 这句呢?地址不为空?可以这样写的吗?有没有基础点的资料。
      

  4.   

    if not (@ParseSysFrame = nil) 这个是判断是否成功取得DLL里面所要的函数地址了。如果@ParseSysFrame = nil表明前面GetProcAddress(G_SysLibHandle, 'ParseSysFrame')返回的是nil,取值不成功。
      

  5.   

    可以看《Delphi 5开发人员指南》,我最近就是在看这本书。没办法,老大让我一定要看一遍。努力啊!
      

  6.   

    哦。
    TScrollBox里放一个TIMAGE控件,当TScrollBox有滚动条时,怎么选择图片中的一部分,但这部分包括显示和没被显示的部分! 
    就想网页中选择文本一样,当选择超过显示部分时,滚动条自动往下滚!这个问题也帮回答下。回答了就结帐下班。