36
Cours C++ (2002) semaine 3 jour 5

Cours de C++, en français, 2002 - Cours 3.5

Embed Size (px)

Citation preview

Page 1: Cours de C++, en français, 2002 - Cours 3.5

Cours C++ (2002)

semaine 3

jour 5

Page 2: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 2

Plan du jour

Exercices récapitulatifs avec C++, une base

de données et XML

Page 3: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 3

Premier programme

Ce premier programme permet d’accèder à

une base de donnée, de créer divers types de

fichiers sérialisés, de modifier ces fichiers et

finalement de modifier la base de donnée

Nous utiliserons la base de données

PTContact dont nous nous sommes déjà

servis

Page 4: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 4

Premier programme (2)

L’accès à la base de données se fera par

ADO, ActiveX Data Object

Les fichiers sérialisés seront de deux type

XML

ADTG, Advanced Data TableGram, un format

Microsoft

Nous créerons également des DOM pour

voir le traitement en cours

Page 5: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 5

Premier programme (3)#import "c:\Program Files\Common Files\system\ado\msado15.dll" \

rename_namespace( "MSXML2" ) rename( "EOF", "ADOEOF" )

#import "c:\WINNT\system32\msxml4.dll"

// pour MSXML 3.0

//#import "c:\WINNT\system32\msxml3.dll"

using namespace MSXML2;

#include <ole2.h>

#include <stdio.h>

#include <conio.h>

#include <io.h>

// une fonction inline pour voir, un peu inutile mais bon pour la démo

inline void TESTHR( HRESULT x ) { if FAILED(x) _com_issue_error( x ); };

Page 6: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 6

Premier programme (4)bool supprimeFichier()

{

struct _finddata_t xml_file;

long hFile;

if( ( hFile = _findfirst( "res.xml", &xml_file ) ) != -1L )

{

DeleteFile( "res.xml" );

DeleteFile( "res_new.xml" );

DeleteFile( "res.adtg" );

return true;

}

else

return false;

}

Page 7: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 7

Premier programme (5)void AffichageErreurCom( _com_error &e )

{

_bstr_t bstrSource( e.Source() );

_bstr_t bstrDescription( e.Description() );

printf( "Erreur COM\n" );

printf( "\tCode - numéro : %08lx\n", e.Error() );

printf( "\tCode - signification : %s\n", e.ErrorMessage() );

printf( "\tSource = %s\n", (LPCSTR) bstrSource );

printf( "\tDescription = %s\n", (LPCSTR) bstrDescription );

}

Page 8: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 8

Premier programme (6)void AffichageErreurProvider( _ConnectionPtr pConnection )

{

ErrorPtr pErr = NULL;

if( ( pConnection->Errors->Count ) > 0 )

{

long nCount = pConnection->Errors->Count;

for( long i = 0; i < nCount; i++ )

{

pErr = pConnection->Errors->GetItem( i );

printf( "Erreur - numéro : %x\n", pErr->Number );

printf( "Erreur - description : %s\n", (LPCSTR)

pErr->Description );

}

}

}

Page 9: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 9

Premier programme (7)void Sauve_DB_XML()

{

HRESULT hr = S_OK;

_RecordsetPtr pRstContacts = NULL;

_bstr_t strCnn( "Provider=MSDASQL.1;Persist Security Info=False;"

"Data Source=PTContact;Mode=ReadWrite" );

try

{

TESTHR(pRstContacts.CreateInstance(__uuidof(Recordset )));

pRstContacts->Open( "SELECT * FROM Contacts",

strCnn,

adOpenDynamic,

adLockBatchOptimistic,

adCmdText );

Page 10: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 10

Premier programme (8)// persistence du RecordSet dans un fichier XML

pRstContacts->Save( "res.xml", adPersistXML );

// persistence du RecordSet dans une structure DOM

IXMLDOMDocumentPtr pXMLDOMDoc;

TESTHR( pXMLDOMDoc.CreateInstance( __uuidof( DOMDocument ) ) );

pRstContacts->Save( pXMLDOMDoc.GetInterfacePtr(), adPersistXML );

// affichage du DOM

printf( pXMLDOMDoc->Getxml() );

pRstContacts->Close();

Page 11: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 11

Premier programme (9)}

catch(_com_error &e)

{

_variant_t vtConnect = pRstContacts->GetActiveConnection();

switch( vtConnect.vt )

{

case VT_BSTR:

AffichageErreurCom( e );

break;

case VT_DISPATCH:

AffichageErreurProvider( vtConnect );

break;

default:

printf( "Une erreur (ni COM, ni provider) s'est produite" );

break;

}

}}

Page 12: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 12

Premier programme (10)void Sauve_XML_ADTG()

{

HRESULT hr = S_OK;

_RecordsetPtr pRstContacts = NULL;

try

{

TESTHR(pRstContacts.CreateInstance(__uuidof(Recordset)));

pRstContacts->Open( "res.xml",

"Provider=MSPersist;",

adOpenForwardOnly,

adLockPessimistic,

adCmdFile );

Page 13: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 13

Premier programme (11)pRstContacts->Find( "LastName = 'BUNIET'", NULL, adSearchForward );

if( pRstContacts->ADOEOF )

{

printf( "Le contact n'a pas été trouvé dans le fichier XML\n" );

pRstContacts->Close();

return;

}

else

{

printf( "Le contact a été trouvé dans le fichier XML\n" );

}

Page 14: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 14

Premier programme (12)pRstContacts->GetFields()->GetItem( "City" )->PutValue( "Berkeley" );

pRstContacts->GetFields()->GetItem( "PostalCode" )->PutValue( "L-2401" );

pRstContacts->Update();

IXMLDOMDocumentPtr pXMLDOMDoc;

TESTHR( pXMLDOMDoc.CreateInstance( __uuidof( DOMDocument ) ) );

pRstContacts->Save( pXMLDOMDoc.GetInterfacePtr(), adPersistXML );

printf( pXMLDOMDoc->Getxml() );

// persistence du RecordSet dans un ADTG

pRstContacts->Save( "res.adtg", adPersistADTG );

pRstContacts->Close();

Page 15: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 15

Premier programme (13)}

catch(_com_error &e)

{

_variant_t vtConnect = pRstContacts->GetActiveConnection();

switch( vtConnect.vt )

{

case VT_BSTR:

AffichageErreurCom( e );

break;

case VT_DISPATCH:

AffichageErreurProvider( vtConnect );

break;

default:

printf( "Une erreur (ni COM, ni provider) s'est produite" );

break;

}

}}

Page 16: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 16

Premier programme (14)void Sauve_ADTG_BD()

{

HRESULT hr = S_OK;

_RecordsetPtr pRstContacts = NULL;

_ConnectionPtr pCnn = NULL;

_bstr_t strCnn( "Provider=MSDASQL.1;Persist Security Info=False;"

"Data Source=PTContact;Mode=ReadWrite" );

try

{

TESTHR( pCnn.CreateInstance( __uuidof( Connection ) ) );

TESTHR(pRstContacts.CreateInstance(__uuidof( Recordset)));

Page 17: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 17

Premier programme (15)pRstContacts->Open( "res.adtg",

"Provider=MSPersist;",

adOpenForwardOnly,

adLockOptimistic,

adCmdFile );

pCnn->Open( strCnn, "", "", NULL );

pRstContacts->PutActiveConnection( _variant_t( (IDispatch *) pCnn ) );

pRstContacts->UpdateBatch( adAffectAll );

pRstContacts->Close();

pCnn->Close();

Page 18: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 18

Premier programme (16)}

catch(_com_error &e)

{

_variant_t vtConnect = pRstContacts->GetActiveConnection();

switch( vtConnect.vt )

{

case VT_BSTR:

AffichageErreurCom( e );

break;

case VT_DISPATCH:

AffichageErreurProvider( vtConnect );

break;

default:

printf( "Une erreur (ni COM, ni provider) s'est produite" );

break;

}

}}

Page 19: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 19

Premier programme (17)void main()

{

if( FAILED( ::CoInitialize( NULL ) ) )

return;

if( supprimeFichier() )

{

printf( "Le fichier res.xml a été supprimé!\n" );

}

printf( "Passage de DB vers XML\n" );

Sauve_DB_XML();

printf( "Passage de XML vers ADTG\n" );

Sauve_XML_ADTG();

printf( "Passage de ADTG vers DB\n" );

Sauve_ADTG_BD();

::CoUninitialize();

}

Page 20: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 20

Premier programme (18)

Ce programme consulte la table Contacts

dans la Data Source PTContact

Il stocke tous les enregistrements dans un

fichier XML

Au passage, on sauve les enregistrements dans

un DOM

Ce DOM est ensuite affiché à l’écran, dans la

console

Page 21: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 21

Premier programme (19)

Le fichier XML est rechargé en mémoire, il

est modifié et sauvagardé dans ub ADTG

Le nouveau DOM est lui aussi affiché dans la

fenêtre console

Le contenu du fichier ADTG est finalement

chargé et sauvegardé dans PTContact

Le tout en COM

Normal pour utiliser de l’ADO !

Page 22: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 22

Premier programme (20)

Exercice :

Reprenez le premier exemple de la journée

traitant de la persistence XML d’une table

d’une base de données relationnelle

Écrivez un fichier XSL permettant de produire

une sortie HTML à ce fichier

Testez votre fichier XSL avec le programme

MSXSL et Internet Explorer (pour le fichier

résultat HTML)

Page 23: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 23

Premier programme (21)

Exercice (suite) :

Modifier le premier programme en vous

inspirant des sources de MSXSL : effectuez la

transformation XSL à l’intérieur du programme

ComSave

Page 24: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 24

Deuxième programme

Il ne s’agit pas d’un programme mais d’un

ensemble de programmes fournis par

Microsoft

Le workspace contient 5 projets liés

Ils permettent de voir la manière de créer et

de traiter des documents XML

Notion de producteurs et de consommateurs

Page 25: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 25

Deuxième programme (2)

Récupérez le fichier xml_consumer.exe

Décompressez le fichier dans votre

répertoire "My Projects"

Ouvrez le fichier de Workspace qui se

trouve sous "XMLComponents"

Le fichier de workspace s’appelle

"XMLComponents.dsw"

Page 26: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 26

Deuxième programme (3)

Mettez l’Active Project sur tstXML

Compilez

Exécutez

Allez regardez c:\example.xml

Page 27: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 27

Deuxième programme (4)

Exercice :

Qui a écrit quoi ?

Modifiez le programme approprié de manière à

créer deux autres childObjects dans le fichier

c.\example.xml

Dans les childObjects générés, ajoutez un

troisième élément racine "myNewValue"

pouvant contenir une chaîne de caractères

Page 28: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 28

L’avenir de C++

C et C++ semble être des langages très

efficaces lorsqu’il s’agit de faire des

programmes dont l’objectif est

D’être compacte

D’être rapide

D’être très technique

Et on peut se dire que c’est vrai…

Page 29: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 29

L’avenir de C++ (2)

À la Washington University de Saint Louis

(Missouri), un chercheur (Douglas Schmidt)

a développé un ensemble de programmes

écrit en C++ permettant de mettre en œuvre

CORBA

Modèle objet distribué "similaire" à COM

Microsoft fait d’ailleurs bizarrement partie des

sponsors ayant financé le projet !

Page 30: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 30

L’avenir de C++ (3)

Cette architecture est composée de deux

blocs

ACE, Adaptive Communication Environment

TAO, The ACE ORB

Page 31: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 31

L’avenir de C++ (4)

La totalité de la plate-forme représente un total de

135.000 ligne de code en C++

C’est beaucoup

Et Douglas Schmidt est un très bon programmeur C++ !

Rassurez-vous, il n’était pas seul pour les 135.000 lignes…

Consultez les sources du projet…

ACE-TAO est très rapide

Il est même tellement rapide qu’il s’agit désormais

d’une plate-forme CORBA temps-réel !

Et il semble que ce soit bien la plus rapide du marché…

Page 32: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 32

L’avenir de C++ (5)

La plate-forme est tellement efficace que certains industriels l’utilisent

Parmi ces industriels se trouvent Boeing

TAO est une plateforme logicielle utilisée dans l’avionique des dernières versions des avions :

F15 Eagle (au moins en test)

F/A 18 Hornet (au moins en test)

AV-8B Harrier (en production)

Page 33: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 33

L’avenir de C++ (6)

C++ semble donc avoir de beaux jours

devant lui

Des produits industriels l’utilisent

Et certains de ces produits sont sensibles !

Et pourtant :

Page 34: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 34

L’avenir de C++ (7)

Douglas Schmidt a quitté la wustl pour

rejoindre UCI, University of California,

Irvine

Il y développe Zen, une plateforme CORBA

temps-réel en … Java

Page 35: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 35

Questions / Remarques

Page 36: Cours de C++, en français, 2002 - Cours 3.5

Cours semaine 3 jour 5 Cours C++ 36

Le mot de la fin

Bons pointeurs !