⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 regic.cpp

📁 自己编写的一个IC卡读卡工具,用于读取卡内资料.
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "RegIC.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFrmRegIC *FrmRegIC;
HINSTANCE m_hDLL;
//---------------------------------------------------------------------------
__fastcall TFrmRegIC::TFrmRegIC(TComponent* Owner,
                    AnsiString AIC,
                    AnsiString AName,
                    AnsiString APwd1,
                    AnsiString APur,
                    AnsiString APwd2)
    : TForm(Owner)
{
    EdtCard->Text=AIC;
    EdtName->Text=AName;
    EdtPwd1->Text=APwd1;
    EdtPur->Text=APur;
    EdtPwd2->Text=APwd2;
}
//---------------------------------------------------------------------------

void __fastcall TFrmRegIC::FormCreate(TObject *Sender)
{
    m_hDLL = LoadLibrary("RC500USB.dll");//打开动态库

    //取得函数地址
    (FARPROC &)RC500USB_init = GetProcAddress(m_hDLL,"RC500USB_init");
    (FARPROC &)RC500USB_exit = GetProcAddress(m_hDLL,"RC500USB_exit");

    (FARPROC &)RC500USB_request = GetProcAddress(m_hDLL,"RC500USB_request");
    (FARPROC &)RC500USB_anticoll = GetProcAddress(m_hDLL,"RC500USB_anticoll");
    (FARPROC &)RC500USB_anticoll2 = GetProcAddress(m_hDLL,"RC500USB_anticoll2");
    (FARPROC &)RC500USB_select = GetProcAddress(m_hDLL,"RC500USB_select");
    (FARPROC &)RC500USB_authentication = GetProcAddress(m_hDLL,"RC500USB_authentication");
    (FARPROC &)RC500USB_authentication2 = GetProcAddress(m_hDLL,"RC500USB_authentication2");
    (FARPROC &)RC500USB_authkey = GetProcAddress(m_hDLL,"RC500USB_authkey");
    (FARPROC &)RC500USB_halt = GetProcAddress(m_hDLL,"RC500USB_halt");
    (FARPROC &)RC500USB_read = GetProcAddress(m_hDLL,"RC500USB_read");
    (FARPROC &)RC500USB_write = GetProcAddress(m_hDLL,"RC500USB_write");
    (FARPROC &)RC500USB_writeval = GetProcAddress(m_hDLL,"RC500USB_writeval");
    (FARPROC &)RC500USB_readval = GetProcAddress(m_hDLL,"RC500USB_readval");
    (FARPROC &)RC500USB_value = GetProcAddress(m_hDLL,"RC500USB_value");
    (FARPROC &)RC500USB_load_key = GetProcAddress(m_hDLL,"RC500USB_load_key");
    (FARPROC &)RC500USB_reset = GetProcAddress(m_hDLL,"RC500USB_reset");
    (FARPROC &)RC500USB_close = GetProcAddress(m_hDLL,"RC500USB_close");
    (FARPROC &)RC500USB_config = GetProcAddress(m_hDLL,"RC500USB_config");
    (FARPROC &)RC500USB_get_info = GetProcAddress(m_hDLL,"RC500USB_get_info");
    (FARPROC &)RC500USB_set_control_bit = GetProcAddress(m_hDLL,"RC500USB_set_control_bit");
    (FARPROC &)RC500USB_clr_control_bit = GetProcAddress(m_hDLL,"RC500USB_clr_control_bit");
    (FARPROC &)RC500USB_buzzer = GetProcAddress(m_hDLL,"RC500USB_buzzer");
    (FARPROC &)RC500USB_read_E2 = GetProcAddress(m_hDLL,"RC500USB_read_E2");
    (FARPROC &)RC500USB_write_E2 = GetProcAddress(m_hDLL,"RC500USB_write_E2");
}

//---------------------------------------------------------------------------

void __fastcall TFrmRegIC::FormShow(TObject *Sender)
{
    RC500USB_init();
    EdtCard->MaxLength=6;
    EdtName->MaxLength=12;
}

//---------------------------------------------------------------------------

void __fastcall TFrmRegIC::BtnOKClick(TObject *Sender)
{
    unsigned long snr;
    unsigned short type;
    unsigned char size;
    unsigned char data[16],val[3];
    unsigned char szpwd[6]={0xff,0xff,0xff,0xff,0xff,0xff};
    AnsiString s1,s2;

    this->ModalResult = mrNone;
    Result=false;

    s1=EdtCard->Text.Trim();
    s2=EdtName->Text.Trim();

    if (s1.Length()!=6)
    {
        ShowMessage("卡号长度应该为6位数!");
        return;
    }
    if (s2.Length()>12)
    {
        ShowMessage("姓名长度过长!");
        return;
    }

    val[0]=s1.SubString(0,2).ToInt();
    val[1]=s1.SubString(3,2).ToInt();
    val[2]=s1.SubString(5,2).ToInt();

    for(int i=0;i!=16;++i)
    {
        if (i<3)
            data[i]=val[i];
        else
            data[i]=s2.c_str()[i-3];
    }


    if(RC500USB_request (1,type)!=0) 		//对读卡器进行操作
    {
       ShowMessage("感应区内没有卡");
       return;
    }
    if(RC500USB_anticoll(0,snr)!=0)			//进行防碰撞选择,成功则返回卡号
    {
        ShowMessage("防碰撞错误");
        return;
    }
    if(RC500USB_select(snr,size)!=0)		//选择卡
    {
        ShowMessage("选择卡错误");
        return;
    }
    EdtCardNo->Text="0x"+AnsiString::IntToHex(snr,8);
    if(RC500USB_authkey(0,szpwd,15)!=0)		//验证第五扇区的密钥A
    {
        ShowMessage("验证错误");
        return;
    }
    if(RC500USB_write(15*4+0,data)!=0)		//写入第五扇区第一块的数据
    {
        ShowMessage("写入数据错误");
        return;
    }
    
    RC500USB_halt();
    Result=true;
    this->ModalResult = mrOk;
}
//---------------------------------------------------------------------------

void __fastcall TFrmRegIC::BtnCancelClick(TObject *Sender)
{
    Result=false;
    this->ModalResult = mrCancel;
}
//---------------------------------------------------------------------------

void __fastcall TFrmRegIC::FormClose(TObject *Sender, TCloseAction &Action)
{
    RC500USB_exit();
    FreeLibrary(m_hDLL);//释放动态库句柄    
}

//---------------------------------------------------------------------------




void __fastcall TFrmRegIC::FormClick(TObject *Sender)
{
    unsigned long snr;
    unsigned short type;
    unsigned char size;
    unsigned char data[16];
    unsigned char szpwd[6]={0xff,0xff,0xff,0xff,0xff,0xff};

    if(RC500USB_request (1,type)!=0) 		//对读卡器进行操作
    {
        ShowMessage("感应区内没有卡");
        return;
    }

    if(RC500USB_anticoll(0,snr)!=0)			//进行防碰撞选择,成功则返回卡号
    {
        ShowMessage("防碰撞错误");
        return;
    }

    if(RC500USB_select(snr,size)!=0)		//选择卡
    {
        ShowMessage("选择卡错误");
        return;
    }
    EdtCardNo->Text="0x"+AnsiString::IntToHex(snr,8);
    if(RC500USB_authkey(0,szpwd,15)!=0)		//验证第五扇区的密钥A
    {
        ShowMessage("验证错误");
        return;
    }

    if(RC500USB_read(15*4+0,data)!=0)		//读取第五扇区第一块的数据
    {
        ShowMessage("读取数据错误");
        return;
    }
    RC500USB_halt();

    EdtCard->Clear();
    EdtName->Clear();
    
    AnsiString s1,s2;
    for(int i=0;i<16;++i)
    {
        if (i<3)
            s1+=(AnsiString)data[i];
        else
            s2+=(char)data[i];
    }

    EdtCard->Text=s1;
    EdtName->Text=s2;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -