Smart Cards

(This page currently only exists in French)

Part 1: Création d'un boite de dialogue

Table of Contents
Part 1: Création d'un boite de dialogue
Part 2: Lecture de notre carte à puce

Les cartes à puces sont de plus en plus répandus. Leur sécurité reste encore exemplaire. Nous allons les étudier d'un peu plus près pour voir comment lire une carte téléphonique classique, et cela sur plusieurs plans: Matériel, fonctionnement de la puce, logiciel. Il nous faudra réaliser un petit programme sur PC qui lira les données: CPucePuce.

Nous allons voir rapidement comment créer une boite de dialogue sans MFC, gérer ses évènements, créer un liste déroulante, etc. Ensuite nous verrons comment lire la puce et interpréter les données.

Création d'un boite de dialogue

On lance Visual C++, nouveau, Projets et on sélectionne "Win32 Application". On valide et on demande "A single Win32 Application" pour avoir un truc vide tout prêt. Maintenant on va modifier notre boite de dialogue dans l'éditeur de ressource et y ajouter tous les contrôles etc. (voir la capture d'écran ci-dessous). Je pense que vous savez faire ça.

Capture d'écran de notre programme une fois terminé

Il reste ensuite à gérer ces contrôles. On ouvre notre fichier source principal et on commence par modifier notre WinMain(...) qui est la première fonction exécutée.

// Le programme commence ici.
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	// On créé la boit de dialogue
	DialogBox(hInstance, (LPCTSTR)IDD_MAIN, NULL, (DLGPROC)DialogProc);

	return false;
}

Une fonction suffit pour créer une boite de dialog. hInstance nous est fournis par Windows. On donne l'ID en chaîne de notre ressource. Pas de parent donc NULL. Et enfin DialogProc pour gérer les évènements. Il s'agit d'une fonction a déclarer avant WinMain évidemment.

//  Traite les messages de la fenêtre.
LRESULT CALLBACK DialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	HWND	hWndCtrl;
	int		wmId,
			wmEvent;

	switch (message)
	{
	case WM_INITDIALOG:		// Initialisation
		g_hDlg = hDlg;			// Au définis la variable globale
		// LPT
		hWndCtrl = GetDlgItem(hDlg, IDC_LPT_COMBO);
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "0x378");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "0x278");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "0x3BC");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "0x2BC");
		SendMessage(hWndCtrl, CB_SETCURSEL, 0, 0);
		// Détection d'insertion
		hWndCtrl = GetDlgItem(hDlg, IDC_DETEC_COMBO);
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "Aucun");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "/ERROR");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "SELECT");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "PE");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "/ACK");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "BUSY");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "/STROBE");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "/AUTOFEED");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "/INIT");
		SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "/SELECT IN");
		SendMessage(hWndCtrl, CB_SETCURSEL, 0, 0);
		/* ATTENTION : J'ai retiré des lignes ici pour éviter
				de répéter du code pour rien */
		break;

	case WM_COMMAND:		// Traitre les commandes
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		switch (wmId)
		{
		case IDCANCEL:			// Quand on clique sur "Quitter"
			PostQuitMessage(0);	// Quitte l'application
			break;
		case IDOK:			// Quand on clique sur "Lire"
			LirePuce();		// Lance la lecture
			break;
		}
		break;

	case WM_DESTROY:		// On quitte tout
		PostQuitMessage(0);
		break;
   }
   return 0;
}

Cette fonction est un CallBack. Soit une fonction appelée par une autre, ici par Windows. Nous allons ajouter les éléments dans les liste déroulantes à l'initialisation de la boite de dialogue: WM_INITDIALOG. Pour ajouter, enlever, etc. des éléments d'une combo box (liste déroulante) on précède par évènement. Nous envoyons donc un évènement à la fenêtre (HWND) de notre contrôle, en lui demandant de rajouter un texte:

hWndCtrl = GetDlgItem(hDlg, IDC_LPT_COMBO);
SendMessage(hWndCtrl, CB_ADDSTRING, 0, (LONG) (LPSTR) "0x378");

Ensuite il s'agit de gérer les évènement des boutons comme de quitter l'application quand on clique sur le bouton Quitter (IDCANCEL). C'est géré dans WM_COMMAND. PostQuitMessage(0) quitte l'application sans erreur (0). LirePuce() est la fonction qui va lire notre puce et afficher ses informations.

Next part Lecture de notre carte à puce

Parts: 1, 2Next