废话不多说 ,问题如下(拜谢!!):DLL函数原型
__int16 __stdcall  Z8_ReadDevInteractRecordValue_Hex(HANDLE icdev,unsigned char addr,int * snlen,unsigned char * snrdata);//成功返回0错误返回-1
说明:调用此函数后返回snrdata的数据的数组空间每条数据长11字节,每次最多读6条
DELPHI代码
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,Types;type
  TForm1 = class(TForm)
    Button1: TButton;
    ComboBox1: TComboBox;
    Label1: TLabel;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    ListBox1: TListBox;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    m_iHandle:integer;
    m_iAddr:integer; //设备地址
    public
   redata: array[0..100] of char  ;
    { Public declarations }
  end;var
  Form1: TForm1;implementation
//port  0代表串口1,1代表串口2
  Function Z8_InitComm(port:integer):integer; stdcall;
      far;external 'Z8rf32.dll' name 'Z8_InitComm' ;//  Z8_ExitComm(HANDLE icdev);
  Function Z8_ExitComm(port:integer):integer; stdcall;
      far;external 'Z8rf32.dll' name 'Z8_ExitComm' ;//  Z8_Beep(HANDLE icdev,unsigned char addr,unsigned char times);
  Function Z8_Beep(port:integer;addr:integer;times:integer):integer; stdcall;
    far;external 'Z8rf32.dll' name 'Z8_Beep';// Z8_RecordCount(HANDLE icdev,unsigned char addr,int * RecordCount);
// Function Z8_RecordCount(icdev:integer;addr:integer;RecordCount:integer):integer; stdcall;
//    far;external 'Z8rf32.dll' name 'Z8_ReadRecordCount';//  Z8_ReadDevInteractRecordValue_Hex(HANDLE icdev,unsigned char addr,int * snlen,unsigned char * snrdata);
 Function Z8_ReadDevInteractRecordValue_Hex(icdev:integer;addr:integer; snlen:Smallint; snrdata: pchar):smallint;
    far;stdcall;external 'Z8rf32.dll' name 'Z8_ReadDevInteractRecordValue_Hex';{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
   m_iHandle:=0;
    try
        m_iHandle:=Z8_InitComm(strtoint(combobox1.Text)-1);
       Label2.Caption:='打开端口成功 OK,m_iHandle='+inttostr(m_iHandle);
       Button1.Enabled:=False;
       Button2.Enabled:=true;
    except
        Label2.Caption:='打开端口失败';
    end;
end;procedure TForm1.Button3Click(Sender: TObject);
var  i:Integer;
begin
    i:=Z8_Beep(m_iHandle,m_iAddr,1);
    Label2.Caption:=inttostr(i);end;procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
    try
        i:=Z8_ExitComm(m_iHandle);
        Label2.Caption:='关闭端口成功'+inttostr(i);
       Button1.Enabled:=True;
       Button2.Enabled:=False;
    except
        Label2.Caption:='关闭端口失败';
    end;
end;procedure TForm1.Button4Click(Sender: TObject);
var i:Integer;
begin
    i:=Z8_ReadDevInteractRecordValue_Hex(m_iHandle,m_iAddr,1,redata) ;
//调试在报错时redata数据正常
    if i = 0 then
      begin
         ListBox1.Items.Add('卡号='+string(redata));
      end;
    if i=-1 then
      begin
       ListBox1.Items.Add('无卡!');
      end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
    m_iAddr:=strtoint('127');
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     m_iHandle := -1;
end;end.
运行错误:access violation at address 10004a2b in module'Z8rf32.dll',write of address 00000001调试在报错时redata数据正常

解决方案 »

  1.   

    调试时一次得到的redata的值为'0','0','0','3','2','e','d','a','0','6','0','9','0','6','1','1','5','5','8','8','3','2'
      

  2.   

    问题已解决,主要是使用PCHAR没先分配内存。
    procedure TForm1.Button4Click(Sender: TObject);
    var
    i:Integer;
    p1:PChar;
    aaa:String;
    begin
    try
        GetMem(p1,1024);
        i:=Z8_ReadDevInteractRecordValue(m_iHandle,m_iAddr,num,p1) ;
        if i =0 then
          begin
            aaa:=String(p1);
            ListBox1.Items.Add('卡号='+aaa);
          end;
        if i=-1 then
          begin
           ListBox1.Items.Add('无卡!')//  'i='+inttostr(i)+
          end;
        FreeMem(p1);
    except
        on e:Exception do showmessage(E.Message);
    end;
    end;