009
30.03.2003, 14:03 Uhr
Tommix
|
Hallo, so, hier das ganze noch mal als (unvollendete) Klasse. Eigentlich hatte ich vor, für die einzelnen Card-Befehle Memberfunktionen zu schreiben, hab dann das Projekt aber fallenlassen. Das Beispiel gibt ein paar Informationen aus und läßt die LED am Chipdrive blinken. Mit der Dokumentation zum Cardserver sollte klar sein, wie man die anderen Funktionen aufruft. Kompilieren als Konsolenanwendung mit MFC-Unterstützung!
C++: |
////////
// SCard.h: Schnittstelle für die Klasse CSCard. // //////////////////////////////////////////////////////////////////////
#if !defined(AFX_SCARD_H__B377D108_6274_11D5_85CE_9E2FAADA0B29__INCLUDED_) #define AFX_SCARD_H__B377D108_6274_11D5_85CE_9E2FAADA0B29__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
class CSCard { public: typedef enum { errNoDLL = -1, errOk = 0000, // ='OK' errNoCOMport = 1001, // ='Serielle Schnittstelle ist nicht verfügbar' errCOMlocked = 1002, // ='Serielle Schnittstelle ist von einer anderen Anwendung belegt' errNoReader = 1008, // ='Kein Lesegerät am Anschluß gefunden' errReaderLocked = 1009, // ='Lesegerät ist gesperrt von #1' errIncompatibility = 1010, // ='Die Anwendung ist mit diesem Lesegerät nicht kompatibel' errNoCard = 4000, // ='Keine Karte im Lesegerät' errCardRemoved = 4001, // ='Karte wurde während des Zugriffs entfernt' errInvalidCard = 4002, // ='Ungültige Karte im Lesegerät' errCantEject = 4004, // ='Karte konnte nicht ausgeworfen werden' errInvalidCommand = 1200, // ='Befehl unbekannt' errNotSupported = 1201, // ='Befehl mit dieser Karte nicht möglich' errBadTerminal = 1202, // ='Befehl mit diesem Terminal nicht möglich' errBadParameter = 1203, // ='Befehlsparameter ungültig' errNoAccess = 1310, // ='Kartenzugriff fehlgeschlagen' errWrongPin = 1311, // ='PIN-Fehler! Noch #1 Versuch(e)' errNoServer = 2000, // ='Server nicht verfügbar' // Diese Texte müssen so übersetzt werden, daß sie kombiniert werden können: // 'TerminalName'+9000 -> CHIPDRIVE micro an COM3 // 9001+9000 -> Suche läuft an COM3 // 9002+9000 -> Kein Gerät an COM3 errOnCOM = 9000, // ='an COM#1' errSearching = 9001, // ='Suche läuft' errNoDevice = 9002, // ='Kein Gerät'
errTooLong = 10000 // Kommando / Daten zu lang } ErrCode;
ErrCode ExecuteCommand(const CString& command); ErrCode ExecuteCommand(const CString& command, CString& dataOut); ErrCode ExecuteCommand(const CString& command, const CString& dataIn, CString& dataOut, long handle = 0); CSCard(); virtual ~CSCard();
private: long (__stdcall *m_pSCardCommand)(long *handle, char *cmd, long *pCmdLen, char *dataIn, long *pDataInLen, char *dataOut, long *pDataOutLen);
HINSTANCE m_hDll; ErrCode m_lastError; ErrCode m_error;
};
#endif // !defined(AFX_SCARD_H__B377D108_6274_11D5_85CE_9E2FAADA0B29__INCLUDED_)
////////
// SCard.cpp: Implementierung der Klasse CSCard. // //////////////////////////////////////////////////////////////////////
#include "stdafx.h" #include "SCard.h"
#ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif
#define MAX_STR_LEN 256
////////////////////////////////////////////////////////////////////// // Konstruktion/Destruktion //////////////////////////////////////////////////////////////////////
CSCard::CSCard() { m_hDll = LoadLibrary("scard32.dll"); if (m_hDll) { m_pSCardCommand = reinterpret_cast<long (__stdcall *)(long *pHandle, char *cmd, long *pCmdLen, char *dataIn, long *pDataInLen, char *dataOut, long *pDataOutLen)> (GetProcAddress(m_hDll,"SCardComand")); m_lastError = m_error = errOk; } else { m_pSCardCommand = NULL; m_lastError = m_error = errNoDLL; }
}
CSCard::~CSCard() { if (m_hDll) FreeLibrary(m_hDll); }
CSCard::ErrCode CSCard::ExecuteCommand(const CString& command, const CString& dataIn, CString& dataOut, long handle /* = 0 */) { if ((command.GetLength() < MAX_STR_LEN) && (dataIn.GetLength() < MAX_STR_LEN)) { if (m_pSCardCommand) { char cmd[MAX_STR_LEN]; strcpy(cmd, command); long cmdLen = strlen(cmd); char dIn[MAX_STR_LEN]; strcpy(dIn, dataIn); long inLen = strlen(dIn);
char dOut[MAX_STR_LEN] = ""; long outLen = MAX_STR_LEN-1;
long ret = m_pSCardCommand(&handle, cmd, &cmdLen, dIn, &inLen, dOut, &outLen); Sleep(100); dataOut = dOut; if ((m_error = static_cast<ErrCode>(ret)) != errOk) m_lastError = m_error; return m_error; } else { return m_lastError = m_error = errNoDLL; } } else { return m_lastError = m_error = errTooLong; } }
CSCard::ErrCode CSCard::ExecuteCommand(const CString& command, CString& dataOut) { return ExecuteCommand(command, "", dataOut); }
CSCard::ErrCode CSCard::ExecuteCommand(const CString& command) { CString dataOut; return ExecuteCommand(command, "", dataOut); }
////////
// SCardTest2.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung. //
#include "stdafx.h" #include "SCard.h" #include "SCardTest2.h"
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif
///////////////////////////////////////////////////////////////////////////// // Das einzige Anwendungsobjekt
CWinApp theApp;
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0;
// MFC initialisieren, Ausgabe und Fehlermeldung bei Fehlern if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // ZU ERLEDIGEN: Fehlercode gemäß Ihren Anforderungen ändern cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } else { // ZU ERLEDIGEN: Anwendungsverhalten hier festlegen. CString out; CSCard card; card.ExecuteCommand("System,Info", out); cout << (const TCHAR*)out<< endl;
card.ExecuteCommand("Device,Info", out); cout << (const TCHAR*)out<< endl;
card.ExecuteCommand("Device,SetLed,01"); cin.get(); card.ExecuteCommand("Device,SetLed,0"); }
return nRetCode; }
|
Gruß, Tommix |