?? scsampledlg.cpp
字號:
return;
}
ProtocolType = ActiveProtocol;
switch (ProtocolType)
{
case SCARD_PROTOCOL_T0:
SetDlgItemText(IDC_OUTPUT, "Function SCardConnect ok\nProtocoltype = T0");
//sprintf((char *) pOutBuffer, "Function SCardConnect ok\nProtocoltype = T0");
//pOutBuffer +=42;
break;
case SCARD_PROTOCOL_T1:
SetDlgItemText(IDC_OUTPUT, "Function SCardConnect ok\nProtocoltype = T1");
//sprintf((char *) pOutBuffer, "Function SCardConnect ok\nProtocoltype = T1");
//pOutBuffer +=42;
break;
default:
sprintf((char *) pOutBuffer, "Function SCardConnect ok\n%.8x", ActiveProtocol);
//pOutBuffer +=35;
SetDlgItemText(IDC_OUTPUT, (char *) pOutBuffer);
break;
}
OutBufferLine = 0;
EnableButton(TRUE);
}
void CSCSampleDlg::EnableButton(BOOL bFlag)
{
(CButton *)GetDlgItem(IDC_CARD_CONNECT)->EnableWindow(!(bFlag));
(CButton *)GetDlgItem(IDCANCEL)->EnableWindow(!(bFlag));
(CButton *)GetDlgItem(IDC_GET_ATTRIBUTE)->EnableWindow(bFlag);
(CButton *)GetDlgItem(IDC_CARD_DISCONNECT)->EnableWindow(bFlag);
(CButton *)GetDlgItem(IDC_TRANSMIT)->EnableWindow(bFlag);
(CButton *)GetDlgItem(IDC_GET_RANDOM)->EnableWindow(bFlag);
(CButton *)GetDlgItem(IDC_CLEAR_CARD)->EnableWindow(bFlag);
(CButton *)GetDlgItem(IDC_CREATE_MF)->EnableWindow(bFlag);
}
void CSCSampleDlg::OnCardDisconnect()
{
// TODO: Add your control notification handler code here
ret = SCardDisconnect(gCardHandle, SCARD_EJECT_CARD);
if (ret != SCARD_S_SUCCESS)
{
GetErrorCode(ret);
}
else
SetDlgItemText(IDC_OUTPUT, "Function SCardDisconnect ok");
EnableButton(FALSE);
}
void CSCSampleDlg::APDUCommand(CString csAPDU)
{
char mhstr[MAX_INPUT];
char buf[MAX_INPUT/2];
CString lcommand;
PBYTE pInBuffer;
memset(mhstr, 0, MAX_INPUT);
lcommand=csAPDU;
lcommand.Remove(' ');
lcommand.Remove(',');
sprintf(mhstr , "%s", LPCTSTR(lcommand));
if (!AToHex((char *) &mhstr, (BYTE *) &buf))
{
return;
}
gIO_Request.dwProtocol = ProtocolType;
gIO_Request.cbPciLength = (DWORD) sizeof(SCARD_IO_REQUEST);
pInBuffer = (PBYTE) malloc( MAX_INPUT );
ASSERT( pInBuffer );
memcpy(pInBuffer, buf, InBufferLength);
ResponseLength = MAX_RESPONSE;
ret = SCardTransmit(gCardHandle, &gIO_Request, pInBuffer, InBufferLength, 0, pResponseBuffer, &ResponseLength);
if (ret != SCARD_S_SUCCESS)
{
GetErrorCode(ret);
free(pInBuffer);
return;
}
PBYTE pStartAddress = pOutBuffer;
if ( ((BYTE) pResponseBuffer[0]==0x90 ) && ((BYTE) pResponseBuffer[1]==0 ))
sprintf((char *) pOutBuffer, "%s ","\nOperate Success!");
else if ( (((BYTE) pResponseBuffer[0]==0x6a )&&((BYTE) pResponseBuffer[1]==0x81 )) || ((BYTE) pResponseBuffer[0]==0x69 )&&((BYTE) pResponseBuffer[1]==0x01) )
sprintf((char *) pOutBuffer, "%s ","\nOperate Fail!");
else
for (unsigned long i=0; i<ResponseLength; i++)
{
sprintf((char *) pOutBuffer, "%.2x ",(BYTE) pResponseBuffer[i]);
pOutBuffer += 3;
if (i > MAX_RESPONSE-3)
break;
}
pOutBuffer = pStartAddress;
OutBufferLine = (ResponseLength * 3)/35;
OutBufferLine++;
if (OutBufferLine > 5)
{
((CScrollBar *)GetDlgItem(IDC_SCROLLBAR))->SetScrollRange(0, OutBufferLine, FALSE);
line = 0;
((CScrollBar *)GetDlgItem(IDC_SCROLLBAR))->SetScrollPos(line, TRUE);
}
SetDlgItemText(IDC_OUTPUT, (const char *) pOutBuffer);
free(pInBuffer);
}
void CSCSampleDlg::OnTransmit()
{
// TODO: Add your control notification handler code here
CString lcommand;
((CComboBox*)GetDlgItem(IDC_COMMAND_IN))->GetWindowText(lcommand);
APDUCommand(lcommand);
}
void CSCSampleDlg::OnCancel()
{
// TODO: Add extra cleanup here
CDialog::OnCancel();
}
void CSCSampleDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
//CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
switch (nSBCode)
{
case SB_LINEDOWN:
++line;
break;
case SB_PAGEDOWN:
++line;
break;
case SB_LINEUP:
--line;
break;
case SB_PAGEUP:
--line;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
line = ((short) ResponseLength) - nPos;
break;
}
UpdateMouseDisplay();
}
void CSCSampleDlg::UpdateMouseDisplay()
{
if (pOutBuffer != NULL)
{
if (OutBufferLine > 5)
{
if (line < 0 )
{
((CScrollBar *)GetDlgItem(IDC_SCROLLBAR))->SetScrollPos(0, TRUE);
line = 0;
}
else if (line > OutBufferLine)
{
((CScrollBar *)GetDlgItem(IDC_SCROLLBAR))->SetScrollPos(OutBufferLine, TRUE);
line = OutBufferLine;
}
else
{
((CScrollBar *)GetDlgItem(IDC_SCROLLBAR))->SetScrollPos(line, TRUE);
}
}
if ((OutBufferLine >= line+4) && (OutBufferLine > 5))
SetDlgItemText(IDC_OUTPUT, (const char *) pOutBuffer+(line*35));
}
UpdateWindow();
}
short CSCSampleDlg::AToHex(char *mhstr, BYTE *buf)
{
InBufferLength = strlen(mhstr);
if (InBufferLength < 3)
{
MessageBox("Input not complete!", "SCSample", MB_ICONSTOP);
GetDlgItem(IDC_COMMAND_IN)->SetFocus();
return(0);
}
for (short i=0; i<InBufferLength; i++)
{
if (mhstr[i] == '\n')
{
mhstr[i] = 0;
}
else if (((mhstr[i] < '0') || (mhstr[i] > '9')) &&
((mhstr[i] != ' ') && (mhstr[i] != ',')) &&
((mhstr[i] < 'a') || (mhstr[i] > 'f')) &&
((mhstr[i] < 'A') || (mhstr[i] > 'F')))
{
MessageBox("Only hex. input allowed!", "SCSample", MB_ICONSTOP);
GetDlgItem(IDC_COMMAND_IN)->SetFocus();
return(0);
}
}
char *s;
if (mhstr[1] == ',')
{
InBufferLength = (InBufferLength - 4)/2;
s = mhstr+4;
}
else
{
InBufferLength = InBufferLength/2;
s = mhstr;
}
memset(buf, 0, sizeof (buf));
i = 0;
while (isspace(*s)) s++;
short k = FALSE;
while (*s)
{
if (isxdigit(*s))
{
buf[i] <<= 4;
if (isalpha(*s))
buf[i] |= (tolower(*s) - 0x57);
else
buf[i] |= (*s - 0x30);
if (k)
{
i++;
k= FALSE;
}
else
{
k= TRUE;
}
s++;
}
else break;
}
return(1);
}
void CSCSampleDlg::GetErrorCode(long ret)
{
switch (ret)
{
case SCARD_E_CANCELLED:
SetDlgItemText(IDC_OUTPUT,"The action was cancelled by an SCardCancel request.");
break;
case SCARD_E_CANT_DISPOSE:
SetDlgItemText(IDC_OUTPUT,"The system could not dispose of the media in the requested manner.");
break;
case SCARD_E_CARD_UNSUPPORTED:
SetDlgItemText(IDC_OUTPUT,"The smart card does not meet minimal requirements for support.");
break;
case SCARD_E_DUPLICATE_READER:
SetDlgItemText(IDC_OUTPUT,"The reader driver didn't produce a unique reader name.");
break;
case SCARD_E_INSUFFICIENT_BUFFER:
SetDlgItemText(IDC_OUTPUT,"The data buffer to receive returned data is too small for the returned data.");
break;
case SCARD_E_INVALID_ATR:
SetDlgItemText(IDC_OUTPUT,"An ATR obtained from the registry is not a valid ATR string.");
break;
case SCARD_E_INVALID_HANDLE:
SetDlgItemText(IDC_OUTPUT,"The supplied handle was invalid.");
break;
case SCARD_E_INVALID_PARAMETER:
SetDlgItemText(IDC_OUTPUT,"One or more of the supplied parameters could not be properly interpreted.");
break;
case SCARD_E_INVALID_TARGET:
SetDlgItemText(IDC_OUTPUT,"Registry startup information is missing or invalid.");
break;
case SCARD_E_INVALID_VALUE:
SetDlgItemText(IDC_OUTPUT,"One or more of the supplied parameters
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -