📄 pcscdlg.cpp
字号:
If Lin=Lex=0, the P3 byte is not send.
------------------------------------------------------------------------------*/
/*
if ((nLenIn == 0) && (nLenOut == 0))
{
dwLengthIn = 4;
}
else
{
if (nLenOut == 0)
{
dwLengthIn--;
}
}
if ((nLenIn == 0) && (nLenOut == 0))
{
szDataIn[dwLengthIn++] = 0;
}
if ( ( dwProtocol == SCARD_PROTOCOL_T1) && ( nLenOut==0 ) )
{
szDataIn[dwLengthIn++] = 0;
}
*/
CString sIn="Command=>> " ,sInTemp;
int i=0 ;
for (i=0;i<dwLengthIn;i++)
{
sInTemp.Format("%02X ",szDataIn[i]);
sIn = sIn + sInTemp;
}
m_list.AddString(sIn);
// For testing only
// memcpy( szDataIn, "\x00\xA4\x00\x00\x02\x3F\x00", 7 ) ;
// dwLengthIn = 7 ;
dwLengthOut = 200;
ScardIoRequest.dwProtocol = dwProtocol;
ScardIoRequest.cbPciLength = sizeof(ScardIoRequest);
lRet = SCardTransmit(hCard, &ScardIoRequest, szDataIn, dwLengthIn, NULL, szDataOut, &dwLengthOut);
CString sLret,sOut=">> " ,sTemp;
sLret.Format("Status: %02Xh",lRet);
m_list.AddString(sLret);
if ((lRet == SCARD_S_SUCCESS) && (dwLengthOut >0))
{
sLret.Format("Card response(%d): ",dwLengthOut);
m_list.AddString(sLret);
for (dwIndex=0;dwIndex<dwLengthOut;dwIndex++)
{
sTemp.Format("%02X ",szDataOut[dwIndex]);
sOut = sOut + sTemp;
}
m_list.AddString(sOut);
}
int nCount = m_list.GetCount();
m_list.SetCurSel(nCount-1);
}
void CPCSCDlg::OnSetfocusEdit7()
{
// TODO: Add your control notification handler code here
int nLen = m_DataIn.GetWindowTextLength();
int n,l;
n= nLen;
l= nLen;
m_DataIn.SetSel(n,l,FALSE);
}
void CPCSCDlg::OnChangeEdit7()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
int nLen = m_DataIn.GetWindowTextLength();
int n,l;
CString sLen, sOut, space, sText;
m_Lc.GetWindowText(sText);
nData = atoi(sText);
n=nLen;
l=nLen;
m_DataIn.SetSel(n,l,FALSE);
m_DataIn.GetWindowText(sLen);
space.Format(" ");
sOut = sLen + space;
switch(nLen)
{
case 2:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 5:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 8:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 11:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 14:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 17:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 20:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 23:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 26:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 29:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 32:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 35:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 38:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 41:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 44:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 47:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 50:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 53:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
case 56:
m_DataIn.SetWindowText(sOut);
n=nLen + 2;
l=nLen + 2;
m_DataIn.SetSel(n,l,FALSE);
break;
}
if (nLen > 57)
{
n=58;
l=58;
m_DataIn.SetSel(0,nLen,FALSE);
m_DataIn.Cut();
}
}
void CPCSCDlg::OnEject()
{
// TODO: Add your control notification handler code here
m_rlist.ResetContent();
m_list.ResetContent();
lRet = SCardDisconnect(hCard,SCARD_LEAVE_CARD);
lRet = SCardDisconnect(hCard,SCARD_EJECT_CARD );
/*------------------------------------------------------------------------------
Close the establish context with the ICC Resource Manager.
------------------------------------------------------------------------------*/
lRet = SCardReleaseContext(hContext);
int nCount = m_list.GetCount();
m_list.SetCurSel(nCount-1);
}
void CPCSCDlg::OnRefresh()
{
dwAtrLength = 32;
CString sTemp;
CPCSCDlg::OnEject();
m_list.ResetContent();
/*------------------------------------------------------------------------------
Establish a context with the ICC Resource Manager.
------------------------------------------------------------------------------*/
lRet = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hContext);
sTemp.Format("SCardEstablishContext : %Xh",lRet);
m_list.AddString(sTemp);
if (lRet != SCARD_S_SUCCESS)
{
AfxMessageBox("SCardEstablishContext failed");
CPCSCDlg::OnOK();
return;
}
/*------------------------------------------------------------------------------
Allocate the size to read the list of the readers
Get the list of readers.
------------------------------------------------------------------------------*/
lRet = SCardListReaders(hContext, NULL, NULL, &dwReadersLength);
sTemp.Format("SCardListReaders: %Xh",lRet);
m_list.AddString(sTemp);
if (lRet != SCARD_S_SUCCESS)
{
AfxMessageBox("SCardListReaders failed");
CPCSCDlg::OnOK();
return;
}
szListReaders = (LPSTR)malloc(dwReadersLength);
lRet = SCardListReaders(hContext, NULL, (LPTSTR)szListReaders, &dwReadersLength);
sTemp.Format("SCardListReaders: %Xh",lRet);
m_list.AddString(sTemp);
if (lRet != SCARD_S_SUCCESS)
{
AfxMessageBox("SCardListReaders failed");
CPCSCDlg::OnOK();
return;
}
// List the available reader
dwIndex = 0;
dwReader = 0;
szFirstReader = (LPTSTR)szListReaders;
//rbuffer[0] = 0;
while (*(szFirstReader) != '\0')
{
sTemp.Format("%d:<%s>",(dwReader + 1),szFirstReader);
dwIndex += strlen(szFirstReader) + 1;
szFirstReader = (LPTSTR)(szListReaders + dwIndex);
dwReader++;
m_rlist.AddString(sTemp);
}
if (dwReader != 0)
{
m_list.AddString("Please select the reader");
}
else m_list.AddString("No reader available");
int nCount = m_list.GetCount();
m_list.SetCurSel(nCount-1);
return;
}
BYTE CPCSCDlg::AscToByte(char asc)
{
switch ( asc )
{
case '0': return 0x00 ;
case '1': return 0x01 ;
case '2': return 0x02 ;
case '3': return 0x03 ;
case '4': return 0x04 ;
case '5': return 0x05 ;
case '6': return 0x06 ;
case '7': return 0x07 ;
case '8': return 0x08 ;
case '9': return 0x09 ;
case 'A': return 0x0a ;
case 'B': return 0x0b ;
case 'C': return 0x0c ;
case 'D': return 0x0d ;
case 'E': return 0x0e ;
case 'F': return 0x0f ;
default: return 0;
}
return 0 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -