VERSION 5.00
Begin VB.Form frmSample 
   BorderStyle     =   1  '固定(実線)
   Caption         =   "Sample"
   ClientHeight    =   3825
   ClientLeft      =   45
   ClientTop       =   435
   ClientWidth     =   4395
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   3825
   ScaleWidth      =   4395
   StartUpPosition =   3  'Windows の既定値
   Begin VB.Frame Frame2 
      Height          =   3165
      Left            =   60
      TabIndex        =   4
      Top             =   570
      Width           =   4245
      Begin VB.TextBox txtBlock 
         Alignment       =   1  '右揃え
         Height          =   300
         Left            =   870
         TabIndex        =   29
         Text            =   "0"
         Top             =   210
         Width           =   840
      End
      Begin VB.Frame Frame3 
         Caption         =   "Value"
         Height          =   855
         Left            =   120
         TabIndex        =   6
         Top             =   2190
         Width           =   3975
         Begin VB.CommandButton cmdValRead 
            Caption         =   "Read"
            Height          =   300
            Left            =   2520
            TabIndex        =   27
            Top             =   330
            Width           =   1290
         End
         Begin VB.CommandButton cmdValWrite 
            Caption         =   "Write"
            Height          =   300
            Left            =   1170
            TabIndex        =   26
            Top             =   330
            Width           =   1290
         End
         Begin VB.TextBox txtVal 
            Alignment       =   1  '右揃え
            Height          =   300
            Left            =   270
            TabIndex        =   25
            Text            =   "1"
            Top             =   330
            Width           =   840
         End
      End
      Begin VB.Frame Frame1 
         Caption         =   "Binary"
         Height          =   1575
         Left            =   120
         TabIndex        =   5
         Top             =   540
         Width           =   3975
         Begin VB.CommandButton cmdBinRead 
            Caption         =   "Read"
            Height          =   300
            Left            =   2520
            TabIndex        =   24
            Top             =   1110
            Width           =   1290
         End
         Begin VB.CommandButton cmdBinWrite 
            Caption         =   "Write"
            Height          =   300
            Left            =   1170
            TabIndex        =   23
            Top             =   1110
            Width           =   1290
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   7
            Left            =   3420
            TabIndex        =   22
            Text            =   "255"
            Top             =   330
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   6
            Left            =   2970
            TabIndex        =   21
            Text            =   "255"
            Top             =   330
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   5
            Left            =   2520
            TabIndex        =   20
            Text            =   "255"
            Top             =   330
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   4
            Left            =   2070
            TabIndex        =   19
            Text            =   "255"
            Top             =   330
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   3
            Left            =   1620
            TabIndex        =   18
            Text            =   "255"
            Top             =   330
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   2
            Left            =   1170
            TabIndex        =   17
            Text            =   "255"
            Top             =   330
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   1
            Left            =   720
            TabIndex        =   16
            Text            =   "255"
            Top             =   330
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   0
            Left            =   270
            TabIndex        =   15
            Text            =   "255"
            Top             =   330
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   15
            Left            =   3420
            TabIndex        =   14
            Text            =   "255"
            Top             =   690
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   14
            Left            =   2970
            TabIndex        =   13
            Text            =   "255"
            Top             =   690
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   13
            Left            =   2520
            TabIndex        =   12
            Text            =   "255"
            Top             =   690
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   12
            Left            =   2070
            TabIndex        =   11
            Text            =   "255"
            Top             =   690
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   11
            Left            =   1620
            TabIndex        =   10
            Text            =   "255"
            Top             =   690
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   10
            Left            =   1170
            TabIndex        =   9
            Text            =   "255"
            Top             =   690
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   9
            Left            =   720
            TabIndex        =   8
            Text            =   "255"
            Top             =   690
            Width           =   390
         End
         Begin VB.TextBox txtData 
            Alignment       =   1  '右揃え
            Height          =   300
            Index           =   8
            Left            =   270
            TabIndex        =   7
            Text            =   "255"
            Top             =   690
            Width           =   390
         End
      End
      Begin VB.Label Label2 
         Caption         =   "Block : "
         Height          =   240
         Left            =   240
         TabIndex        =   28
         Top             =   240
         Width           =   555
      End
   End
   Begin VB.CommandButton cmdDisconnect 
      Caption         =   "Disconnect"
      Height          =   300
      Left            =   3000
      TabIndex        =   3
      Top             =   150
      Width           =   1290
   End
   Begin VB.CommandButton cmdConnect 
      Caption         =   "Connect"
      Height          =   300
      Left            =   1650
      TabIndex        =   2
      Top             =   150
      Width           =   1290
   End
   Begin VB.TextBox txtPort 
      Alignment       =   1  '右揃え
      Height          =   300
      Left            =   750
      TabIndex        =   1
      Text            =   "1"
      Top             =   180
      Width           =   390
   End
   Begin VB.Label Label1 
      Caption         =   "Port : "
      Height          =   240
      Left            =   240
      TabIndex        =   0
      Top             =   210
      Width           =   555
   End
End
Attribute VB_Name = "frmSample"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private m_Eng As CaoEngine
Private m_Ctrl As CaoController
Private m_Ext As CaoExtension

Private m_byCurSector As Byte

Private Sub Form_Load()
    
    ' CAOエンジンの生成
    Set m_Eng = New CaoEngine
    
End Sub

Private Sub cmdConnect_Click()

    On Error GoTo ErrProc
    
    ' オブジェクトの生成
    Set m_Ctrl = m_Eng.Workspaces(0).AddController("IC", "CaoProv.DENSO.ICCard", "", "Port=" & txtPort.Text)
    Set m_Ext = m_Ctrl.AddExtension("@Mifare")

    ' カードアクセスの前処理
    m_Ctrl.Execute "ResetMain"          ' リーダライタの初期化
    m_Ext.Execute "SetCarrierState", 2  ' カードへの電源供給開始
    
    ' リーダライタを相互認証モードに設定(これをしないとカードアクセスコマンドが実行できない)
    Dim vntRnd1 As Variant
    Dim vntRnd2 As Variant
    vntRnd1 = m_Ext.Execute("Authentication1")  ' 認証用乱数１の取得
    vntRnd2 = Array(&HFF, &HFF, &HFF, &HFF, &HFF, &HFF, &HFF, &HFF)  ' 認証用乱数２(任意の値)
    m_Ext.Execute "Authentication2", Array(vntRnd1, vntRnd2)
    
    ' ICカードの活性化
    m_Ext.Execute "AutoSelect", 1
    
    m_byCurSector = &HFF
    
    Exit Sub

ErrProc:
    MsgBox Err.Description
End Sub

Private Sub cmdDisconnect_Click()

    Set m_Ctrl = Nothing
    Set m_Ext = Nothing
    m_Eng.Workspaces(0).Controllers.Clear

End Sub

Private Sub cmdBinWrite_Click()

    On Error GoTo ErrProc
    
    ' カードのブロックチェック
    CheckBlock (txtBlock.Text)

    ' データの書き込み
    Dim i As Integer
    Dim byData(15) As Byte
    For i = 0 To 15
        byData(i) = txtData(i).Text
    Next
    
    m_Ext.Execute "Write", Array(txtBlock.Text, byData)


    Exit Sub

ErrProc:
    MsgBox Err.Description
    
    ' エラー時は待機状態になるので再活性化
    m_Ext.Execute "AutoSelect", 2

End Sub

Private Sub cmdBinRead_Click()
    
    On Error GoTo ErrProc
    
    ' カードのブロックチェック
    CheckBlock (txtBlock.Text)

    ' データの読込み
    Dim vntData As Variant
    vntData = m_Ext.Execute("Read", txtBlock.Text)

    Dim i As Integer
    For i = 0 To 15
        txtData(i).Text = vntData(i)
    Next

    Exit Sub

ErrProc:
    MsgBox Err.Description
    
    ' エラー時は待機状態になるので再活性化
    m_Ext.Execute "AutoSelect", 2
    
End Sub

Private Sub cmdValWrite_Click()
    
    On Error GoTo ErrProc
    
    ' カードのブロックチェック
    CheckBlock (txtBlock.Text)

    ' Value値の書き込み
    m_Ext.Execute "ValueWrite", Array(txtBlock.Text, txtVal.Text)

    Exit Sub

ErrProc:
    MsgBox Err.Description
    
    ' エラー時は待機状態になるので再活性化
    m_Ext.Execute "AutoSelect", 2
    
End Sub


Private Sub cmdValRead_Click()

    On Error GoTo ErrProc
    
    ' カードのブロックチェック
    CheckBlock (txtBlock.Text)

    ' Value値の読込み(Value値専用の読み込みコマンドはないため，通常読み込み後，先頭4バイトを数値化)
    Dim vntData As Variant
    vntData = m_Ext.Execute("Read", txtBlock.Text)

    txtVal.Text = vntData(3) * &H1000000 + _
                  vntData(2) * &H10000 + _
                  vntData(1) * &H100 + _
                  vntData(0)
    Exit Sub

ErrProc:
    MsgBox Err.Description
    
    ' エラー時は待機状態になるので再活性化
    m_Ext.Execute "AutoSelect", 2
    
End Sub



Private Sub CheckBlock(byBlock As Byte)

    ' ブロックのセクター番号を計算
    Dim bySector As Byte
    If byBlock >= &H80 Then
        Dim byTemp As Byte
        byTemp = byBlock - &H80
        bySector = (byTemp \ &H10) + &H20
    
    Else
        bySector = byBlock \ &H4
    
    End If
    
    ' セクターが変更されていれば，再認証
    If m_byCurSector <> bySector Then
        m_byCurSector = bySector
        
        Dim vntKey As Variant
        vntKey = Array(&HFF, &HFF, &HFF, &HFF, &HFF, &HFF)  ' カードの認証キー(サンプルカードのキー(FF,FF,FF,FF,FF,FF))
        m_Ext.Execute "Authentication", Array(bySector, 1, vntKey)  '　Aキーを使って認証
    End If

End Sub

