[DUG] RFID - EAccess violation

Marshland Engineering marshland at marshland.co.nz
Wed May 27 23:56:07 NZST 2015


I'm a bit out my depth. Is there something I have missed ?

EAccess violation  at address 000000000 

I purchased an RFID reader with sample code. I stripped out what was not
necessary and ended up with this.

Sorry for the long code

**************************************************************

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
  ComCtrls, StdCtrls, XPMenu, ExtCtrls;

type
  TForm1 = class(TForm)
    showm: TRichEdit;
    Button1: TButton;
    procedure falsereason(s:string);
    procedure bReadClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

function
API_PCDRead(comHandle:Thandle;DeviceAddress:integer;mode:byte;add_blk,num_blk:integer;
snr,buffer:pchar):integer;stdcall;external 'mi.dll';

var
  Form1: TForm1;
  comhandle : Thandle ;
  reason:string;
implementation

{$R *.dfm}

procedure TForm1.falsereason(s:string);
begin
     if s=''   then begin reason:=''; exit; end;
     if s='00' then begin reason:=''; exit ; end;
     etc 
     if s='96' then begin reason:='The Operation Do Not Success....';   exit;
end;
end;

procedure TForm1.bReadClick(Sender: TObject);
var
 buffer,bufferr:array [0..255] of char;
 receive,i :integer;
 keydata,cardnum,showmemo:string;
 key : pchar;
begin
   setlength(keydata,6);
   for i:=1 to 6 do  begin
     keydata[i]:=Chr(StrToInt('$FF'));
   end;
   key:=StrPCopy(buffer,keydata);
   receive:=API_PCDRead(0,0,$00,10,1,key,bufferr);
   case receive of
    0:begin
         for i:=0 to 3 do begin
            cardnum:=cardnum+ inttohex(ord(buffer[i]),2);
         end;
         showm.Lines.Add('Number :'+cardnum);
      end;
    1:begin
          falsereason(inttohex(ord(bufferr[0]),2));
          showm.Lines.Add(reason+#13#10);
       end
     else
      showm.Lines.Add('error,no data receive...'+#13#10);
   end;
end;

end.
****************************************************************
I added the above to my code and it complies but crashes when I do a receive.
EAccess


unit uMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, Menus, ComCtrls, StdCtrls, Printers, DBCtrls, 
  Mask, ExtCtrls, IniFiles, DB, ShellAPI, XPMenu;


type
  TfMain = class(TForm)
    pcMembers: TPageControl;
    Members: TTabSheet;
    Events: TTabSheet;
    DBGrid1: TDBGrid;
    DBGrid4: TDBGrid;
    DBGrid5: TDBGrid;
    Label3: TLabel;
    bFees: TButton;
    Button1: TButton;
    bEmail: TButton;
    dbgMembers: TDBGrid;
    Label5: TLabel;
    Label7: TLabel;
    dbgFeesMem: TDBGrid;
    dbgSubs: TDBGrid;
    Label4: TLabel;
    Label2: TLabel;
    puSubs: TPopupMenu;
    puSubsAdd: TMenuItem;
    puSubsDel: TMenuItem;
    puFeesListPrinter: TMenuItem;
    puFeesListScreen: TMenuItem;
    upFeesCardsNotSent: TMenuItem;
    PrintSet1: TPrinterSetupDialog;
    puEventFees: TPopupMenu;
    puFeesAdd: TMenuItem;
    puFeesDelete: TMenuItem;
    puFeesList: TMenuItem;
    puMembers: TPopupMenu;
    puAddMember: TMenuItem;
    puDeleteMember: TMenuItem;
    puBikes: TPopupMenu;
    puAddBike: TMenuItem;
    puDeleteBike: TMenuItem;
    dbmNotes: TDBMemo;
    Label6: TLabel;
    dbgIncident: TDBGrid;
    Label8: TLabel;
    PrintDialog1: TPrintDialog;
    puIncident: TPopupMenu;
    AddIncident1: TMenuItem;
    DeleteIncident1: TMenuItem;
    dtpMainDate: TDateTimePicker;
    DBEdit1: TDBEdit;
    Label1: TLabel;
    Label9: TLabel;
    cbMainYear: TComboBox;
    DBGrid2: TDBGrid;
    bPostFees: TButton;
    Button2: TButton;
    eCardNumber: TEdit;
    procedure dbgMembersDblClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure dbgSubsDblClick(Sender: TObject);
    procedure puSubsAddClick(Sender: TObject);
    procedure puSubsDelClick(Sender: TObject);
    procedure upFeesCardsNotSentClick(Sender: TObject);
    procedure puFeesListPrinterClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure dbmNotesExit(Sender: TObject);
    procedure puFeesAddClick(Sender: TObject);
    procedure puFeesDeleteClick(Sender: TObject);
    procedure dbgFeesDblClick(Sender: TObject);
    procedure dbgMembersKeyPress(Sender: TObject; var Key: Char);
    procedure puFeesListClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure puAddMemberClick(Sender: TObject);
    procedure puDeleteMemberClick(Sender: TObject);
    procedure puAddBikeClick(Sender: TObject);
    procedure puDeleteBikeClick(Sender: TObject);
    procedure DBGrid2DblClick(Sender: TObject);
    procedure dbmNotesEnter(Sender: TObject);
    procedure puFeesListScreenClick(Sender: TObject);
    procedure bEmailClick(Sender: TObject);
    procedure DBGrid3ColExit(Sender: TObject);
    procedure dbgIncidentCellClick(Column: TColumn);
    procedure AddIncident1Click(Sender: TObject);
    procedure DeleteIncident1Click(Sender: TObject);
    procedure MembersShow(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure falsereason(s:string);    
  private
    { Private declarations }
  public
     sKey:String;
     bFeesFirstTime:Boolean;
  end;

function
API_PCDRead(comHandle:Thandle;DeviceAddress:integer;mode:byte;add_blk,num_blk:integer;
snr,buffer:pchar):integer;stdcall;external 'mi.dll';

var
   fMain:TfMain;
   comhandle:Thandle ;
   Reason:String;

implementation

uses uDM, uMembers, uSubs, uMemCards, uEventFees, uLogon, uBikes, uMemoShow,
  uEmail, uIncident;

{$R *.dfm}

procedure TfMain.falsereason(s:string);
begin
     if s=''   then begin reason:=''; exit; end;
     if s='00' then begin reason:=''; exit ; end;
     etc
     if s='95' then begin reason:='The lock Operation Do Not Success....'; 
exit; end;
     if s='96' then begin reason:='The Operation Do Not Success....';   exit;
end;
end;


********  My other code, 

procedure TfMain.Button2Click(Sender: TObject);
var
 buffer,bufferr:array [0..255] of char;
 receive,i :integer;
 keydata,cardnum,showmemo:string;
 key : pchar;
begin
   setlength(keydata,6);
   for i:=1 to 6 do  begin
     keydata[i]:=Chr(StrToInt('$FF'));
   end;
   key:=StrPCopy(buffer,keydata);
   receive:=API_PCDRead(0,0,$00,10,1,key,bufferr);
   case receive of
    0:begin
         for i:=0 to 3 do begin
            cardnum:=cardnum+ inttohex(ord(buffer[i]),2);
         end;
         showm.Lines.Add('Number :'+cardnum);
      end;
    1:begin
          falsereason(inttohex(ord(bufferr[0]),2));
          showm.Lines.Add(reason+#13#10);
       end
     else
      showm.Lines.Add('error,no data receive...'+#13#10);
   end;
end;

end.



More information about the Delphi mailing list