📄 scsampledlg.cpp
字号:
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CSCSampleDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CSCSampleDlg::OnConnect()
{
DWORD ActiveProtocol = 0;
ProtocolType = SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1;
ret = SCardConnect(ContextHandle, ReaderName[act_Name], SCARD_SHARE_EXCLUSIVE, ProtocolType, &CardHandle, &ActiveProtocol);
if (ret != SCARD_S_SUCCESS){
GetErrorCode(ret);
return;
}
ProtocolType = ActiveProtocol;
switch (ProtocolType) {
case SCARD_PROTOCOL_T0:
SetDlgItemText(IDC_OUT, "Function SCardConnect ok\nProtocoltype = T0");
break;
case SCARD_PROTOCOL_T1:
SetDlgItemText(IDC_OUT, "Function SCardConnect ok\nProtocoltype = T1");
break;
default:
sprintf((char *) pOutBuffer, "Function SCardConnect ok\n%.8x", ActiveProtocol);
SetDlgItemText(IDC_OUT, (char *) pOutBuffer);
break;
}
OutBufferLine = 0;
(CButton *)GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE);
(CButton *)GetDlgItem(IDCANCEL)->EnableWindow(FALSE);
(CButton *)GetDlgItem(IDC_CARD_DISCONNECT)->EnableWindow(TRUE);
(CButton *)GetDlgItem(IDC_TRANSMIT)->EnableWindow(TRUE);
}
void CSCSampleDlg::OnTransmit()
{
char mhstr[MAX_INPUT];
char buf[MAX_INPUT/2];
PBYTE pInBuffer;
memset(mhstr, 0, MAX_INPUT);
CString com;
((CComboBox*)GetDlgItem(IDC_IN))->GetWindowText(com);
sprintf(mhstr , "%s", LPCTSTR(com));
if (!AToHex((char *) &mhstr, (BYTE *) &buf)) {
return;
}
IO_Request.dwProtocol = ProtocolType;
IO_Request.cbPciLength = (DWORD) sizeof(SCARD_IO_REQUEST);
pInBuffer = (PBYTE) malloc( MAX_INPUT );
ASSERT( pInBuffer );
memcpy(pInBuffer, buf, InBufferLength);
ResponseLength = MAX_RESPONSE;
ret = SCardTransmit(CardHandle, &IO_Request, pInBuffer, InBufferLength, 0, pResponseBuffer, &ResponseLength);
if (ret != SCARD_S_SUCCESS){
GetErrorCode(ret);
free(pInBuffer);
return;
}
PBYTE pStartAddress = pOutBuffer;
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_OUT, (const char *) pOutBuffer);
free(pInBuffer);
}
void CSCSampleDlg::OnCardDisconnect()
{
ret = SCardDisconnect(CardHandle, SCARD_EJECT_CARD);
if (ret != SCARD_S_SUCCESS){
GetErrorCode(ret);
}
else
SetDlgItemText(IDC_OUT, "Function SCardDisconnect ok");
(CButton *)GetDlgItem(IDC_CONNECT)->EnableWindow(TRUE);
(CButton *)GetDlgItem(IDCANCEL)->EnableWindow(TRUE);
(CButton *)GetDlgItem(IDC_CARD_DISCONNECT)->EnableWindow(FALSE);
(CButton *)GetDlgItem(IDC_TRANSMIT)->EnableWindow(FALSE);
}
void CSCSampleDlg::OnCancel()
{
ret = SCardReleaseContext(ContextHandle);
if (ret != SCARD_S_SUCCESS){
GetErrorCode(ret);
}
free(pOutBuffer);
free(pResponseBuffer);
CDialog::OnCancel();
}
void CSCSampleDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* 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_OUT, (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_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_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_OUT,"The action was cancelled by an SCardCancel request.");
break;
case SCARD_E_CANT_DISPOSE:
SetDlgItemText(IDC_OUT,"The system could not dispose of the media in the requested manner.");
break;
case SCARD_E_CARD_UNSUPPORTED:
SetDlgItemText(IDC_OUT,"The smart card does not meet minimal requirements for support.");
break;
case SCARD_E_DUPLICATE_READER:
SetDlgItemText(IDC_OUT,"The reader driver didn't produce a unique reader name.");
break;
case SCARD_E_INSUFFICIENT_BUFFER:
SetDlgItemText(IDC_OUT,"The data buffer to receive returned data is too small for the returned data.");
break;
case SCARD_E_INVALID_ATR:
SetDlgItemText(IDC_OUT,"An ATR obtained from the registry is not a valid ATR string.");
break;
case SCARD_E_INVALID_HANDLE:
SetDlgItemText(IDC_OUT,"The supplied handle was invalid.");
break;
case SCARD_E_INVALID_PARAMETER:
SetDlgItemText(IDC_OUT,"One or more of the supplied parameters could not be properly interpreted.");
break;
case SCARD_E_INVALID_TARGET:
SetDlgItemText(IDC_OUT,"Registry startup information is missing or invalid.");
break;
case SCARD_E_INVALID_VALUE:
SetDlgItemText(IDC_OUT,"One or more of the supplied parameters
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -