procedure TForm1.Button3Click(Sender: TObject);
var
        s:String;
        i:integer;
begin
      buf[0]:=$79;
      buf[1]:=$78;
      buf[2]:=$4A;
      buf[3]:=$2E;
      buf[4]:=0;
      buf[5]:=0;
      buf[6]:=0;
      buf[7]:=0;
      Ret:=SystemInitialization_EX(@buf);  //设置读取参数
        if Ret<>1 then
            begin
               CheckErr(Ret);         //出错检测
                Exit;
            end;      Ret:=ReadSystemPas_EX(@buf);  //读客户参数
        if Ret<>1 then
            begin
               CheckErr(Ret);         //出错检测
                Exit;
            end;
       //------------------------------------------------------------
       //以十六进制数进行字符串显示保存
       //------------------------------------------------------------
      s := '';
      for i:=0 to 8 do
      begin
          s:= s+IntToHex(buf[i],2);
      end;     TSystemPas.Text := s;
     LSystemPas.Caption := s;       Button4.Enabled:=true;
       Button3.Enabled:=false;
end;procedure TForm1.Button4Click(Sender: TObject);
begin      Ret:=SystemInitialization_EX(@buf);  //设置客户参数
        if Ret<>1 then
            begin
               CheckErr(Ret);         //出错检测
                Exit;
            end;
  
我只知道这是一段门锁管理系统读写授权卡的代码,谁能给我具体解释下
另外我还想知道
1、红色代码@buf什么意思啊?Delphi里@和$是什么意思?
2、我不想每次制卡都读取授权卡参数设置才能制卡,我想直接制卡,怎样把我读取的客户参数直接写进去,跳过读参数这部分呢
请高手赐教。万分感谢!

解决方案 »

  1.   

    @buf表示获取buf的地址
    $表示16进制,$79表示16进制的79也就是十进制的121
      

  2.   

    高手~那我怎么跳过制卡前的必须读取授权卡的参数这步骤呢。
    我现在读出来
    TSystemPas.Text := s;
    显示出来的一排数字和字母应该就是参数
    怎么直接利用这个参数呢,而不用每次都先读取授权卡才能制卡
      

  3.   

    这个倒不是关键,我是想知道怎么跳过这个读取函数步骤,直接把我已经知道了的唯一不变的授权卡参数写进去,然后制卡,这样就不用每次都先读授权卡才能制卡了
    对了~是用ReadSystemPas函数从"授权卡"中读取参数 ,然后把所读到的参数放入SystemInitialization参数中的。
      

  4.   

    大家帮帮我啊,解决后我可以把这个帖子里的100分也散给大家,万分感谢真的很急。Delphi高手指点一下。
    http://topic.csdn.net/u/20101025/21/80a0054a-58a3-4d29-afd9-69b97089421f.html
      

  5.   

      代码给太少了,看不出。 
      ReadSystemPas具体是怎么操作的?读与写是否有关联(例如写函数要用的变量,需要在读函数中赋值)?
      如果有关联,那么你不能省略读操作。
      举个例子。   
      var
       myParameter:string;  procedure TForm1.Button1Click(Sender: TObject);
      var
        para:string;
      begin
       para:='myparameters';       //获取参数
       ReadPara(para);             //读取参数
       setPara;                    //保存参数到button(把button想象成卡)
       //想不调用读操作是不可能的,因为所需要的myParameter在读操作里才有。
       //即使你不调用读操作,那你也必须将关键的赋值,自己手动补上。
       {
         para:='myparameters';       
          myParameter:=para;         //其实依然做了读操作的工作。
          setPara;
         }
      end;
      
       procedure TForm1.ReadPara(para:string);
      begin
        myParameter:=para;
      end;
      
        procedure TForm1.setPara;
      begin
        button1.caption:=myParameter;
      end;   
      除非读写操作无关联,否则不能跳掉读操作,可一般不太可能出现这样的情况。
      试问,你不读哪里来的写。
      正如上面那个例子,怎么都要对myparameter赋值,你才能将正确值写入button中。
      

  6.   

    就这几句涉及system和read函数的~前面就有个function定义SystemInitialization_EX(Password:Pointer): SmallInt; stdcall;external 'Card.dll';
    Function ReadSystemPas(Password:Pointer): SmallInt; stdcall;external 'Card.dll';
      

  7.   

      兄弟,我依然看不出。
      反正我是觉得,得看读函数和写函数的代码怎么写的,估计可以吧。
      你那dll没源代码的吧,这样太难了。
      帮不到你。抱歉啊。
      

  8.   

    dll没源代码的~我也不知道读和写函数怎么定义的。
    我读出来的参数显示出来
       s := '';
      for i:=0 to 8 do
      begin
      s:= s+IntToHex(buf[i],2);
      end;  TSystemPas.Text := s;
    是一串十六进制数字,我想可不可以把它直接放在SystemInitialization_EX(那串16进制数字)里
    另外代码里@buf是不是16进制的数字?