具体的是一个磁卡读写器的操作(读取磁道信息)函数
可是我调用的时候有问题
我感觉应该写成 
function Rcard (SetCMD: pcahr; var RData:PChar;Track:Integer):Integer;请各位看看以下为厂家提供的原文: INT Rcard(CHAR *SET,CHAR *RDATA,INT TRACK)功能:控制sLe353b进行读磁卡操作,按ESC键可退出.返回: 整型
   =  1:    读卡正确,
     -1:    所选串行口打不开
     -2:    与磁卡读写机通信失败(磁卡机没有与主机连接或连接不正确)     
     -3:    串口设置错误
     -4:    读卡错误
     -5:    用户 ESC 退出参数:
 SET:  字符串,用来设置串口.
       格式:"1,9600,N,8,1" ------ (1=com1或2=com2),
(9600=baud9600或4800=baud4800
 或2400=baud2400或1200=baud1200),
(N=无校验或O=奇校验或N=偶校验),
(8=8个数据位或7=7个数据位),
(1=1个停止位或2=2个停止位).
       如:"2,9600,O,7,1" 表示串口2,波特率9600.奇校验,7个数据位,1个停止位. TRACK: 需要进行写卡操作的磁道选择号(具体定义如下:)           
            --------  1:选择第1磁轨 
                2:选择第2磁轨
        3:选择第3磁轨
        4:选择第2和第1磁轨
        5:选择第2和第3磁轨  RDATA: 读卡数据输出缓冲区(用于存放读卡成功后的返回数据)
字符串,长度不少于300字节.
     
读卡成功返回格式: 
     RDATA = "磁道1数据"       ------- 返回磁道1数据(此时 TRACK 为1)
     RDATA = "磁道2数据"             ------- 返回磁道2数据(此时 TRACK 为2)           
     
    读卡错误: Rcard函数返回值为-4
       
       其中: 小写字符a为磁道2与磁道1(或磁道2与磁道3)的数据的分隔符
             1道数据可为字母或数字,最多76个
             2道数据只可为数字,最多37个 
             3数据只可为数字,最多104个
             
       如:
             Rcard("1,9600,N,8,1",RDATA,1)
                       -------- 表示通过串行口1以波特率9600BPS,8位数据位,1位停止位,
                                     无校验的方式从第1磁轨中读取数据(存放在RDATA中)
                                     
             Rcard("1,9600,N,8,1",RDATA,2)
                       -------- 表示通过串行口1以波特率9600BPS,8位数据位,1位停止位,
                                     无校验的方式从第2磁轨中读取数据(存放在RDATA中)     
                                             

解决方案 »

  1.   

    函数返回值是正确的, 但是delphi提示是    Access violation at address 32323235,. Read of address 32323235
      

  2.   

    我具体是这么调用的procedure TForm1.Button1Click(Sender: TObject);
    var
       RData: Pchar;
       strMsg: String;
    begin
       Case Rcard('1,9600,0,8,1', RData,  2) of
            1:
            begin
                 strMsg := '读卡正确' ;
                 //Memo1.Lines.Add(RData);
            end;
            -1:
                 strMsg := '所选串行口打不开';
            -2:
                 strMsg := '与磁卡读写机通信失败(磁卡机没有与主机连接或连接不正确)';
            -3:
                 strMsg := '串口设置错误';
            -4:
                 strMsg := '读卡错误';
            -5:
                 strMsg := '用户 ESC 退出';
       end;
       Memo1.Lines.Add(strMsg);
    end;
      

  3.   

    原厂的函数怎么给你法的?DLL形式?
      

  4.   

    是因為參數RDATA沒有分配內存造成的。RDATA: 读卡数据输出缓冲区(用于存放读卡成功后的返回数据)
           字符串,长度不少于300字节.
      

  5.   

    我已经解决了
    自定义了一个格式     TArrayChar = array [0..350] of Char;function Rcard(SetCMD: Pchar; var RData: TArrayChar;  Track: Integer):LongInt; stdcall; 'KeyCard.dll';