Cours C++ (2002)
semaine 3
jour 5
Cours semaine 3 jour 5 Cours C++ 2
Plan du jour
Exercices récapitulatifs avec C++, une base
de données et XML
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
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
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 ); };
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;
}
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 );
}
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 );
}
}
}
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 );
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();
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;
}
}}
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 );
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" );
}
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();
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;
}
}}
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)));
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();
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;
}
}}
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();
}
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
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 !
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)
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
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
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"
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
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
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…
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 !
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
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é…
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)
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 :
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
Cours semaine 3 jour 5 Cours C++ 35
Questions / Remarques
Cours semaine 3 jour 5 Cours C++ 36
Le mot de la fin
Bons pointeurs !