SlideShare une entreprise Scribd logo
1  sur  94
Télécharger pour lire hors ligne
Cours C++ (2002)
semaine 3
jour 1
Cours semaine 3 jour 1 Cours C++ 2
Plan du jour
 ActiveX
Cours semaine 3 jour 1 Cours C++ 3
Présentation d’ActiveX
 ActiveX est une technologie purement
Microsoft, ne fonctionnant que sur les plate-
formes Microsoft
 Cependant, les idées qui s’y trouvent sont
partagées par beaucoup
 Développement de composants
 Réutilisabilité des composants pour la
composition d’applications
Cours semaine 3 jour 1 Cours C++ 4
Présentation d’ActiveX (2)
 La première solution permettant de greffer
une application sur Windows consistait à
utiliser des DLL, Dynamic Link Libraries
 Permet de partager du code entre plusieurs
applications, le code est normalement moins
bogué car plus utilisé
 Facilité de mise à jour avec une copie en un
endroit, copie qui peut être remplacée sans
réaliser une édition de liens
Cours semaine 3 jour 1 Cours C++ 5
Présentation d’ActiveX (3)
 Plusieurs manière de lier une application à
une ou plusieurs DLL :
 Early binding : au lancement d’un programme
qui l’utilise, les DLL sont chargées en mémoire
 Run-Time Binding : une DLL est chargée en
mémoire losrque le programme en a besoin
 Toutes les DLL ont un DllMain() pour
l’initialisation et la terminaison
Cours semaine 3 jour 1 Cours C++ 6
Présentation d’ActiveX (4)
 Toutes les méthodes d’une DLL peuvent être
exportées
 Les données d’une DLL peuvent être privées ou
exportées
 Une DLL peut être ou non liée aux MFC
 Elle peut utiliser les services fournis par mfcXX.dll ou
pas
 Il existe des DLL régulières (interfaces C, même
pour VisualBasic) et des DLL étendues (interfaces
C++, permettant de construire des objets)
Cours semaine 3 jour 1 Cours C++ 7
Présentation d’ActiveX (5)
 Dans les DLL :
 AFX_MANAGE_STATE(
AfxGetStaticModuleState() ); dans chaque
méthode qui utilise des MFC
 Déclaration des méthodes et données exportées
par _dllspec( dllexport ) int MaFonc( int x );
 Dans les programmes utilisant la DLL :
 _dllspec( dllimport ) int MaFonc( int x );
pour utiliser une fonction de la DLL
Cours semaine 3 jour 1 Cours C++ 8
Présentation d’ActiveX (6)
 ActiveX est une évolution de solutions déjà
existantes chez Microsoft
 Windows 16 bits : DDE, Dynamic Data
Exchange, permet l’échange de données entre
deux applications
 Puis OLE, Object Linking and Embedding,
utilisant une approche objet : possibilité
d’intégrer dans une application des objets issus
d’autres applications Windows
Cours semaine 3 jour 1 Cours C++ 9
Présentation d’ActiveX (7)
OLE : composition,
stockage, échange
et intégration de
documents
Microsoft
Application 1
Application 2
Application 1 Application 2DDE
OLE
Cours semaine 3 jour 1 Cours C++ 10
Présentation d’ActiveX (8)
 Avec OLE, il est possible d’embarquer un
document rattaché à une application dans un
autre document rattaché à une autre
application
 Un tableau Excel dans un document Word
 Cependant, si l’on modifie le document
embarqué, on lance l’application
responsable dans une autre fenêtre
Cours semaine 3 jour 1 Cours C++ 11
Présentation d’ActiveX (9)
 Puis OLE 2, corrections des défauts d’OLE
(…) et introduction du modèle COM,
Component Object Model
 OLE 2 et COM étant disponibles, Microsoft
introduit alors la notion de composants
OLE, OCX, OLE Control eXtension
 Utilisable au départ avec les extensions VBX de
VisualBasic, prédécesseur d’OCX
Cours semaine 3 jour 1 Cours C++ 12
Présentation d’ActiveX (10)
 Avec OLE 2, il est encore (…) possible
d’embarquer un document dans un autre d’un type
différent
 Cette fois, le document embarqué sera modifié à
l’intérieur de l’autre
 Si l’on modifie un document Excel dans un document
Word, le document Word reste visible « autour » du
document Excel. L’utilisateur n’a pas l’impression de
quitter Word mais Excel est lancé et s’occupe de la
gestion graphique et remplace les menus de
l’application du document englobant par ses propres
menus
Cours semaine 3 jour 1 Cours C++ 13
Présentation d’ActiveX ()
Cours semaine 3 jour 1 Cours C++ 14
Présentation d’ActiveX ()
Cours semaine 3 jour 1 Cours C++ 15
Présentation d’ActiveX (13)
 Les OCX sont basés sur OLE 2 mais ne sont
pas restreints aux documents
 La technique d’insertion de ressources
graphiques est étendue à tout type de
programmes
 Un OCX est plus qu’une DLL car il fournit
le code, les ressources graphiques mais
également les mécanismes de gestion des
ressources graphiques et du comportement
Cours semaine 3 jour 1 Cours C++ 16
Présentation d’ActiveX (14)
 Remarque : le modèle COM adhère aux
idées théoriques relatives à la création, à la
distribution et à la réutilisation de
composants.
 COM a été développé par Digital (DEC)…
COM est d’ailleurs disponible sur OpenVMS !
 Rappelez vous que Windows NT (3.51…) est
également l’héritier direct de VMS, écrit par
Digital ?
Cours semaine 3 jour 1 Cours C++ 17
Présentation d’ActiveX (15)
 Il existe également une version Solaris
(l’Unix de Sun) et une version True64Unix
disponible auprès de l’OpenGroup
 Seul problème : la licence coûte 35.000
dollars US pour 5 postes !
 Mais pour ce prix là, on vous livre les sources !
Il y a donc moyen de déboguer…
Cours semaine 3 jour 1 Cours C++ 18
Présentation d’ActiveX (16)
 ActiveX utilise (respecte) COM ou DCOM
(Distributed COM) pour la communication
 Comparaison frustre par rapport à CORBA :
CORBA OLE
Couche de
transport
ORB
COM (local)
DCOM (réseau)
vendeurs
nombre
incalculable
Microsoft
Cours semaine 3 jour 1 Cours C++ 19
Présentation d’ActiveX (17)
 Il est souvent question de contrôles ActiveX
 Il ne s’agit ni plus ni moins que de l’utilisation
d’ActiveX (d’OCX) dans des pages HTML
 Équivalent aux plug-ins de Netscape
 Permet de lancer une application au sein d’une page
HTML ou en lieu et place d’une page HTML
 Un document Word, PDF, Powerpoint peut être visionné dans
Internet Explorer
 Même la machine virtuelle Java est un contrôle ActiveX pour
Internet Explorer !
 Peut s’utiliser avec ActiveX Scripting
Cours semaine 3 jour 1 Cours C++ 20
Présentation d’ActiveX (18)
 ActiveX Automation est le nouveau nom
d’OLE Automation
 Permet à une application Word ou Visual Basic
d’accèder à des objets COM
 Il s’agit d’objets de base sans rapport avec la
notion de Document/View
Cours semaine 3 jour 1 Cours C++ 21
Présentation d’ActiveX (19)
 DocObject, ou Document Object, ou
ActiveX document, permet d’afficher un
document à l’intérieur d’un autre
 En quelque sorte, OLE 3.0
 Une application peut être un serveur DocObjet
tandis qu’une autre sera un client DocObjet
 Internet Explorer est un client DocObjet pour de
nombreuses applications
Cours semaine 3 jour 1 Cours C++ 22
Présentation d’ActiveX (20)
 Avantages d’ActiveX
 Migration rapide d’OLE 2.0 vers DocObject
(mais pas d’OCX vers DocObject…)
 Dans IE, rapidité des contrôles ActiveX qui
sont compilés en binaire (Java est compilé mais
doit encore être interprété par la JVM)
 Intégration complète avec le système Win32
 Un ActiveX peut effectuer des tâches
d’administration : c’est bien s’il ne s’agit pas d’un
virus, d’un vers ou d’un cheval de Troie…
Cours semaine 3 jour 1 Cours C++ 23
Présentation d’ActiveX (21)
 Inconvénients d’ActiveX
 Portabilité discutable : il faut une version d’un
ActiveX pour 95/NT, une pour NT MIPS, une
pour Macintosh
 Bien plus faible sécurité que Java. Offre une
signature de contrôle mais passée cette sécurité,
un ActiveX peut TOUT faire
 InternetExploder permet de rebooter Windows dès
qu’il est appelé dans une page HTML
Cours semaine 3 jour 1 Cours C++ 24
COM / DCOM
 COM et DCOM sont à la base des
composants ActiveX
 Il est impossible de faire des ActiveX sans !
 Du point de vue de Microsoft, cela offre une
interface de programmation unifiée
 En local (COM), mélange des DLL et de l’IPC,
Inter Process Communication
 En distribué, idem mais le « fil » est plus long :
RPC, Remote Procedure Call
Cours semaine 3 jour 1 Cours C++ 25
COM / DCOM (2)
 COM est un standard de communication
 COM est un framework permettant de créer
et d’utiliser des composants
 Les composants remplissent les slots vides du
framework
Cours semaine 3 jour 1 Cours C++ 26
COM / DCOM (3)
 COM est un « standard » défini au niveau
binaire
 N’importe quel langage
 N’importe quel endroit (intra-process, inter-
process et inter-machine)
 Les performances du modèle intra-process ne
doivent pas être dégradées par rapport à la
solution DLL
Cours semaine 3 jour 1 Cours C++ 27
COM / DCOM (4)
 Principes de COM
 Utilisation d’interfaces pour implémenter des
comportements
 Toute manipulation du composant se fait à
travers une interface
 Un objet COM peut implémenter plusieurs
interfaces simultanéement
 Le composant lui-même est une boite noire
Cours semaine 3 jour 1 Cours C++ 28
COM / DCOM (5)
Serveur
COM
Object
IUnknown
DoFirstFunction()
DoOtherFunction( )
DoMyVeryLastFunction( )
IRobot
IDispatch
Cours semaine 3 jour 1 Cours C++ 29
COM / DCOM (6)
 En définissant un objet COM, il faut
obligatoirement implémenter certaines
interfaces obligatoires
 Elles permettent de faire le lien avec les
mécanismes se trouvant dans la librairie COM
 D’autres interfaces peuvent être définies
pour donner sa spécificité au composant
Cours semaine 3 jour 1 Cours C++ 30
COM / DCOM (7)
 Les interfaces permettent de spécifier le contrat de
l’objet
 Comme pour les ADT
 Elles définissent les comportements, pas les états
 Elles sont identifiées par un IID, Interface ID
 Elles doivent dériver de IUnknown
 Sorte de super interface, équivalent d’une super classe
Object qui n’existe pas en C++
 La syntaxe d’une interface est définie dans une
librairie de types (définition des entrées et des
sorties)
Cours semaine 3 jour 1 Cours C++ 31
COM / DCOM (8)
 Les interfaces
 Sont immuables
 Pour modifier une interface, il faut en créer une
nouvelle avec un nouveau numéro de version
 Renvoient généralement un résultat HRESULT
(un type Windows)
 Attention au problème des passages par
valeur et des passages par référence
 Attention à la taille des objets envoyés
Cours semaine 3 jour 1 Cours C++ 32
COM / DCOM (9)
 Les classes qui implémentent les interfaces
sont des classes COM
 Elles possèdent un nom
 Elles contiennent l’implémentation
 Elles sont identifiées par un CLSID, Class ID
 Les objets COM sont des instances de la
classe COM
 Les composants COM sont des ensembles
avec les interfaces, le code, etc
Cours semaine 3 jour 1 Cours C++ 33
COM / DCOM (10)
Operating System
Application Operating System
Application
Application
DLL
Différentes physionomies d’appels
Cours semaine 3 jour 1 Cours C++ 34
COM / DCOM (11)
 L’architecture de Microsoft se veut
transparente pour les appels
 Les objets s’appellent de la même manière
quelle que soit leur localisation
 Le cas le plus rapide correspond au cas où les
composants se trouvent dans une DLL qui est
utilisée de la même manière que ce qui a été vu
précédemment
Cours semaine 3 jour 1 Cours C++ 35
COM / DCOM (12)
 En fait :
 L’intra-process se fait grâce aux DLL
 L’inter-process se fait grâce aux EXE
 Les DLL continuent à ressembler à des
DLL, mais se sont désormais des objets
COM
Cours semaine 3 jour 1 Cours C++ 36
COM / DCOM (13)
Inprocess
Client Composant
COM
runtime
COM
runtime
DCOM network
protocol
Remote
Local
IPC
Security
provider
RPC
Protocol stack
Security
provider
RPC
Protocol stack
Cours semaine 3 jour 1 Cours C++ 37
COM / DCOM (14)
Client Composant
Client ComposantCOM
Processus client Processus serveur
COM
DCE
RPC
Client
ServeurClient
COM Composant
Inprocess :
appel rapide et
direct des fonctions
Local :
sur une même
machine, appel
rapide
Remote :
distribué : appel de
l’objet résidant sur
une autre machine
Cours semaine 3 jour 1 Cours C++ 38
COM / DCOM (15)
 Pour le RPC dans DCOM, DCE-RPC est
utilisé
 DCE signifie Distributed Computing
Environment
 Il s’agit de la première tentantive industrielle de
communication inter-systèmes
 Elle a eu très peu de succès (très lourd)
 CORBA s’en est aussi inspiré pour aller plus
loin (GIOP et IIOP)…
Cours semaine 3 jour 1 Cours C++ 39
COM / DCOM (16)
 Ce que COM/DCOM assure pour vous :
 Sécurité (mais pas complètement ! Rappelez
vous les problèmes des contrôles ActiveX)
 Informations sur le type (répertoire des
interfaces disponibles : Interface Repository)
 Information sur le nommage : nom de l’objet
rattaché à son emplacement, processus de
naming assuré par des monikers chez
Microsoft
Cours semaine 3 jour 1 Cours C++ 40
COM / DCOM (17)
 Ce que COM/DCOM assure pour vous (2) :
 Invocation dynamique (dynamic invocation)
qui est baptisée automation
 Transfert de données : il s’agit d’un protocole
de transport après tout !
 Gestion du registry (sert dans le processus de
nommage)
 Gestion des catégories de composants
Cours semaine 3 jour 1 Cours C++ 41
COM / DCOM (18)
 Ce que COM/DCOM assure pour vous (3) :
 La gestion des transactions à condition d’avoir
une base de données qui les supporte (ce n’est
pas le cas d’Access mais de SQL Server,
développé à partir de Sybase)
 Les transactions distribuées nécessitent COM+
 Communications asynchrones, à condition
d’avoir le Microsoft Transaction Server
Cours semaine 3 jour 1 Cours C++ 42
COM / DCOM (19)
COM Runtime
COM et DCOM Registry
Securité
(SSPI)
NTLM
Kerberos
Norme de Transports DCE
MS-RPC
TCP UDP IPX SPX HTTP “Falcon”
ETC...
Services de base
(Automation, Monikers, Storage, ComCat, Data Transfer, IR)
Composants et Applications
Cours semaine 3 jour 1 Cours C++ 43
COM / DCOM (20)
Pointer to Method 1
Pointer to Method 6
Pointer to Method 3
Pointer to Method 4
Pointer to Method 5
Pointer to Method 2
MaFonction1() {...}
MaFonction2() {...}
MaFonction3() {...}
MaFonction4() {...}
MaFonction5() {...}
MaFonction6() {...}VTABLE
Client
Objet
Pointeur sur
l‘interface
Pointeur interne
sur la
VTABLE
Réalisation d’un appel :
Pointer to members ?
Cours semaine 3 jour 1 Cours C++ 44
COM / DCOM (21)
 Avant que le client ait le lien présenté vers
l’interface, le système doit la trouver en
fonction des informations fournies par le
client
 Processus mis en œuvre : nommage, gestion du
registre, gestion du cycle de vie et transport des
données
Cours semaine 3 jour 1 Cours C++ 45
COM / DCOM (22)
Client
Serveur
Objet
Librairie
COM
CLSID_X
CLSID_Y
C:SERVER1.DLL
C:SERVER2.EXE
...
System registry
2 : COM localise
et instancie le
serveur
3 : un pointeur vers
les interfaces de A
est retourné par la
librairie COM
4 : le client peut
appeler des
fonctions de A
1 : le client appelle
CoCreateInstance
( CLSID_Y,IID_A )
A
...
Cours semaine 3 jour 1 Cours C++ 46
COM / DCOM (23)
objetProxy
client Stub
Processus client Processus serveur
Même machine
IPC
En local :
Cours semaine 3 jour 1 Cours C++ 47
COM / DCOM (24)
objetProxy
client Stub
Processus client Processus serveur
Machine X Machine Y
RPC
En remote :
Cours semaine 3 jour 1 Cours C++ 48
COM / DCOM (25)
 Les proxy et les stub sont des classes qui
sont parfois qualifiées de helpers
 Ils effectuent l’encodage binaire de
l’information pour l’envoyer sur le « fil » du
côté de l’émetteur
 Ils effectuent le décodage du stream binaire de
l’autre côté du fil pour récupérer l’information
 Les principes sont les même dans tous les
environnements de distribution objets
Cours semaine 3 jour 1 Cours C++ 49
COM / DCOM (26)
 Pour respecter la théorie, on parle de
 Marshalling pour l’encodage du message
binaire
 Unmarshalling pour le décodage du message
binaire
 Une fois le codage effectué, il est possible
d’envoyer le flux sur de nombreux types de
protocoles de transport de bas niveau
Cours semaine 3 jour 1 Cours C++ 50
COM / DCOM (27)
TCP, UDP
IPX, SPX
HTTP
ServeurClient
C
O
MQueued
Clients
C
O
M
Objet
COM
Différentes normes de transport :
Cours semaine 3 jour 1 Cours C++ 51
COM / DCOM (28)
 Les proxy et les stubs doivent, bien
évidemment, se comprendre parfaitement de
chaque côté du fil
 Ils doivent comprendre les messages de la
même manière, exactement
 Pour éviter les problèmes, ils sont définis à
partir d’un seul et même fichier
 Fichier (M)IDL, Microsoft Interface Definition
Language
Cours semaine 3 jour 1 Cours C++ 52
COM / DCOM (29)
Définition d‘interface
et de librairies en IDL
Compilateur
MIDL
Proxies Type library (.tlb)Stubs Autres fichiers
Cours semaine 3 jour 1 Cours C++ 53
COM / DCOM (30)
 Attention aux différences de vocabulaire !
 L’IDL de Microsoft n’est pas l’IDL de CORBA
 Avant l’IDL, Microsoft avait l’ODL et a maintenant
le MIDL (IDL de CORBA semble registered)
 Le client Microsoft utilise un proxy et le
serveur Microsoft utilise un stub
 Le client CORBA utilise un stub et le serveur
CORBA utilise un skeleton
Cours semaine 3 jour 1 Cours C++ 54
ATL
 Active Template Library
 Nous en avons déjà parlé… De même que de la
WTL
 ATL est une librairie bien plus légère que MFC
qui permet de développer de petits composants
ayant des capacités d’exécution plus rapide que
les applications MFC
 Mais certains développements ATL utilisent MFC…
Cours semaine 3 jour 1 Cours C++ 55
ATL (2)
 ATL version 1 apportait le support de
IUnknown, IClassFactory (une autre
manière de créer un objet), IDispatch,
IConnectionPointContainer et les
énumérations COM
 ATL version 2 : améliorations et support des
contrôles ActiveX
 ATL version 3 : améliorations…
Cours semaine 3 jour 1 Cours C++ 56
ATL (3)
 ATL est normalement fait pour être utilisée
en conjonction avec la STL, cette dernière
fournissant les strings et collections qui ne
se trouvent pas dans ATL
Cours semaine 3 jour 1 Cours C++ 57
ATL (4)
 La gestion des évènements se fait à travers
un connection point qui a besoin
 D’une source qui envoie des évènements
 Interface IConnectionPoint
 Plusieurs sources d’un objet dans un
IConnectionPoint Container
 D’un réceptacle (sink) qui les reçoit
 D’un mécanisme qui permet d’attacher la
source à son réceptacle
Cours semaine 3 jour 1 Cours C++ 58
ATL (5)
 Supposons que nous utilisons la classe
COM “Exemple”
 Templates source disponibles dans ATL
 IConnectionPointContainerImpl<CExemple>
 Cproxy_IExempleEvents<CExemple>
 BEGIN_COM_MAP et
BEGIN_CONNECTION_POINT_MAP
Cours semaine 3 jour 1 Cours C++ 59
ATL (6)
 Template réceptacle
 Implémentation de l’interface
IDispEventImpl<>
 Enregistrement du mécanisme avec
IConnectionPoint::Advise et
IConnectioPoint::Unadvise
Cours semaine 3 jour 1 Cours C++ 60
ATL (7)
 Création d’un ActiveX
 Création du squelette du contrôle (AppWizard)
 Ajout de propriétés accessibles depuis
l’extérieur (ClassWizard)
 Ajout de méthodes : définition des actions du
contrôleur
 Ajout d’évènements : gestion des évènements
utilisateur
 Signature du code : certificat d’authentification
Cours semaine 3 jour 1 Cours C++ 61
ATL (8)
 Pattern d’utilisation d’un ActiveX:
void f( void )
{
IUnknown* pUnk = 0; // 0 pour NULL
// demande de création
HRESULT hr = DemandeUnObjet( &pUnk );
if( SUCCEEDED( hr ) )
{
// utilisation de l’objet obtenu
UneFonction( pUnk );
}
// libération
pUnk->release()
}
Cours semaine 3 jour 1 Cours C++ 62
ATL (9)
Cours semaine 3 jour 1 Cours C++ 63
ATL (10)
Cours semaine 3 jour 1 Cours C++ 64
ATL (11)
Le serveur COM
sera une DLL
L’initialisation de
la DLL se fera là
L’IDL à
compléter est là
Cours semaine 3 jour 1 Cours C++ 65
ATL ()
Cours semaine 3 jour 1 Cours C++ 66
ATL ()
Cours semaine 3 jour 1 Cours C++ 67
ATL ()
Cours semaine 3 jour 1 Cours C++ 68
ATL (15)
Cours semaine 3 jour 1 Cours C++ 69
ATL (16)
Cours semaine 3 jour 1 Cours C++ 70
ATL (17)
Cours semaine 3 jour 1 Cours C++ 71
ATL (18)
Cours semaine 3 jour 1 Cours C++ 72
ATL (19)
Cours semaine 3 jour 1 Cours C++ 73
ATL ()
Cours semaine 3 jour 1 Cours C++ 74
ATL (21)
Cours semaine 3 jour 1 Cours C++ 75
ATL ()
Cours semaine 3 jour 1 Cours C++ 76
ATL ()
Cours semaine 3 jour 1 Cours C++ 77
ATL ()
Cours semaine 3 jour 1 Cours C++ 78
ATL (25)
 Nous avons désormais un objet COM qui
fonctionne !
 Il est dans une DLL
 Il possède une méthode
 Il est enregistré dans le système
 Sauvez tous les fichiers et fermez le
Workspace courant
Cours semaine 3 jour 1 Cours C++ 79
ATL (26)
 Dans le répertoire ProjectsSimple_ATL, cherchez
le fichier Simple_ATL_i.c
 Copier/coller les lignes suivantes dans un fichier avec
WordPad ou NotePad :
 const IID IID_IFirst_ATL =
{0x6E236158,0xB1E0,0x4440,{0xB8,0xA0,
0x24,0xA1,0x1F,0xCA,0xCA,0x98}};
 const CLSID CLSID_First_ATL =
{0xE5EBE21E,0x50D1,0x438D,{0xB8,0x48,
0x0D,0xA4,0x47,0x72,0x8C,0xE3}};
 Les valeurs que vous aurez seront différentes de celles
présentées ici !
Cours semaine 3 jour 1 Cours C++ 80
ATL (27)
 Nous allons maintenant créer un programme
client simple
 Pour ne pas perdre les bonne habitudes, nous
allons utiliser une Windows 32 console
Application qui sera exécutée dans une fenêtre
Shell
Cours semaine 3 jour 1 Cours C++ 81
ATL (28)
Cours semaine 3 jour 1 Cours C++ 82
ATL (29)
Cours semaine 3 jour 1 Cours C++ 83
ATL (30)
Cours semaine 3 jour 1 Cours C++ 84
ATL (31)
#include "..Simple_ATLSimple_ATL.h"
#include <iostream.h>
const IID IID_IFirst_ATL = // valeur dans Simple_ATL_i.c
const CLSID CLSID_First_ATL = // valeur dans Simple_ATL_i.c
void main( void )
{
HRESULT hr;
IFirst_ATL *IFirstATL;
hr = CoInitialize( 0 );
Cours semaine 3 jour 1 Cours C++ 85
ATL (32)
if( SUCCEEDED( hr ) )
{
hr = CoCreateInstance(
CLSID_First_ATL,
NULL,
CLSCTX_INPROC_SERVER,
IID_IFirst_ATL,
(void**) &IFirstATL );
if( SUCCEEDED( hr ) )
{
long ReturnValue;
hr = IFirstATL->AddNumbers( 5, 7,
&ReturnValue );
Cours semaine 3 jour 1 Cours C++ 86
ATL (33)
cout << "la somme de 5 + 7 est : ";
cout << ReturnValue << endl;
hr = IFirstATL->Release();
}
else
{
cout << "CoCreateInstance : echec.";
cout << endl;
}
}
CoUninitialize();
}
Cours semaine 3 jour 1 Cours C++ 87
ATL ()
Cours semaine 3 jour 1 Cours C++ 88
ATL (35)
Cours semaine 3 jour 1 Cours C++ 89
ATL (36)
 Copiez/collez la ligne de l’IID
 Mettez une des deux lignes en
commentaires pour conserver la bonne
information
 Dans l’autre ligne, modifier un seul chiffre,
recompiler et exécutez
Cours semaine 3 jour 1 Cours C++ 90
ATL (37)
Cours semaine 3 jour 1 Cours C++ 91
ATL (38)
 Le lien avec le serveur placé dans la DLL
est donc fait à l’aide de l’IID et du CLSID
 La moindre modification de ces chiffres fait
perdre le lien
 En fait, le lien obtenu à travers la registry
est perdu
Cours semaine 3 jour 1 Cours C++ 92
ATL (39)
Cours semaine 3 jour 1 Cours C++ 93
ATL (40)
 Les choses se compliquent un peu avec des
exécutables à la place des DLL
 Cela peut être pire si c’est distribué
 C’est encore plus compliqué avec des MFC
à côté des ATL
 Microsoft Visual Studio fait la majeure
partie du code pour vous
 NE LE MODIFIER PAS !!!!!
Cours semaine 3 jour 1 Cours C++ 94
Questions / Remarques

Contenu connexe

Similaire à Cours de C++, en français, 2002 - Cours 3.1

Entity_framework_db first
Entity_framework_db firstEntity_framework_db first
Entity_framework_db firstZineb ELGARRAI
 
Réutilisation de code entre Windows 8 et Windows Phone 8.
Réutilisation de code entre Windows 8 et Windows Phone 8.Réutilisation de code entre Windows 8 et Windows Phone 8.
Réutilisation de code entre Windows 8 et Windows Phone 8.Microsoft
 
Cours de C++, en français, 2002 - Cours 1.4
Cours de C++, en français, 2002 - Cours 1.4Cours de C++, en français, 2002 - Cours 1.4
Cours de C++, en français, 2002 - Cours 1.4Laurent BUNIET
 
Architecture mvc
Architecture mvcArchitecture mvc
Architecture mvcMadridal
 
Outils de construction pour la recherche
Outils de construction pour la rechercheOutils de construction pour la recherche
Outils de construction pour la rechercheJohan Moreau
 
Fondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application FlexFondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application Flexdavid deraedt
 
Fondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application FlexFondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application Flexdavid deraedt
 
Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Microsoft
 
Code flow - Cocoaheads paris
Code flow - Cocoaheads parisCode flow - Cocoaheads paris
Code flow - Cocoaheads parisCocoaHeads France
 
Dev Drink II (Flex by Navx)
Dev Drink II (Flex by Navx)Dev Drink II (Flex by Navx)
Dev Drink II (Flex by Navx)ALTAIDE
 
Cours de C++, en français, 2002 - Cours 3.2
Cours de C++, en français, 2002 - Cours 3.2Cours de C++, en français, 2002 - Cours 3.2
Cours de C++, en français, 2002 - Cours 3.2Laurent BUNIET
 
Windows phone 7 sync application sur Azure, création d'application offline re...
Windows phone 7 sync application sur Azure, création d'application offline re...Windows phone 7 sync application sur Azure, création d'application offline re...
Windows phone 7 sync application sur Azure, création d'application offline re...Microsoft Décideurs IT
 
Adobe flex®
Adobe flex®Adobe flex®
Adobe flex®finalspy
 

Similaire à Cours de C++, en français, 2002 - Cours 3.1 (20)

Entity_framework_db first
Entity_framework_db firstEntity_framework_db first
Entity_framework_db first
 
Architecture .net
Architecture  .netArchitecture  .net
Architecture .net
 
Chapitre 1
Chapitre 1Chapitre 1
Chapitre 1
 
Réutilisation de code entre Windows 8 et Windows Phone 8.
Réutilisation de code entre Windows 8 et Windows Phone 8.Réutilisation de code entre Windows 8 et Windows Phone 8.
Réutilisation de code entre Windows 8 et Windows Phone 8.
 
Cours de C++, en français, 2002 - Cours 1.4
Cours de C++, en français, 2002 - Cours 1.4Cours de C++, en français, 2002 - Cours 1.4
Cours de C++, en français, 2002 - Cours 1.4
 
Framework .net overview
Framework .net overviewFramework .net overview
Framework .net overview
 
Architecture mvc
Architecture mvcArchitecture mvc
Architecture mvc
 
Outils de construction pour la recherche
Outils de construction pour la rechercheOutils de construction pour la recherche
Outils de construction pour la recherche
 
Fondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application FlexFondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application Flex
 
Fondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application FlexFondamentaux d'architecture d'une application Flex
Fondamentaux d'architecture d'une application Flex
 
Tour Horizont.Net
Tour Horizont.NetTour Horizont.Net
Tour Horizont.Net
 
Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5
 
Code flow - Cocoaheads paris
Code flow - Cocoaheads parisCode flow - Cocoaheads paris
Code flow - Cocoaheads paris
 
Dev Drink II (Flex by Navx)
Dev Drink II (Flex by Navx)Dev Drink II (Flex by Navx)
Dev Drink II (Flex by Navx)
 
Introduction à ASP.NET
Introduction à ASP.NETIntroduction à ASP.NET
Introduction à ASP.NET
 
Cours de C++, en français, 2002 - Cours 3.2
Cours de C++, en français, 2002 - Cours 3.2Cours de C++, en français, 2002 - Cours 3.2
Cours de C++, en français, 2002 - Cours 3.2
 
Windows phone 7 sync application sur Azure, création d'application offline re...
Windows phone 7 sync application sur Azure, création d'application offline re...Windows phone 7 sync application sur Azure, création d'application offline re...
Windows phone 7 sync application sur Azure, création d'application offline re...
 
Adobe flex®
Adobe flex®Adobe flex®
Adobe flex®
 
Cours architecture
Cours architectureCours architecture
Cours architecture
 
PFE PPT2
PFE PPT2PFE PPT2
PFE PPT2
 

Plus de Laurent BUNIET

Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Laurent BUNIET
 
Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4Laurent BUNIET
 
Cours de C++, en français, 2002 - Cours 3.3
Cours de C++, en français, 2002 - Cours 3.3Cours de C++, en français, 2002 - Cours 3.3
Cours de C++, en français, 2002 - Cours 3.3Laurent BUNIET
 
Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5Laurent BUNIET
 
Cours de C++, en français, 2002 - Cours 2.4
Cours de C++, en français, 2002 - Cours 2.4Cours de C++, en français, 2002 - Cours 2.4
Cours de C++, en français, 2002 - Cours 2.4Laurent BUNIET
 
Cours de C++, en français, 2002 - Cours 2.3
Cours de C++, en français, 2002 - Cours 2.3Cours de C++, en français, 2002 - Cours 2.3
Cours de C++, en français, 2002 - Cours 2.3Laurent BUNIET
 
Cours de C++, en français, 2002 - Cours 2.2
Cours de C++, en français, 2002 - Cours 2.2Cours de C++, en français, 2002 - Cours 2.2
Cours de C++, en français, 2002 - Cours 2.2Laurent BUNIET
 
Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Laurent BUNIET
 
Cours de C++, en français, 2002 - Cours 1.5
Cours de C++, en français, 2002 - Cours 1.5Cours de C++, en français, 2002 - Cours 1.5
Cours de C++, en français, 2002 - Cours 1.5Laurent BUNIET
 
Cours de C++, en français, 2002 - Cours 1.3
Cours de C++, en français, 2002 - Cours 1.3Cours de C++, en français, 2002 - Cours 1.3
Cours de C++, en français, 2002 - Cours 1.3Laurent BUNIET
 
Cours de C++, en français, 2002 - Cours 1.2
Cours de C++, en français, 2002 - Cours 1.2Cours de C++, en français, 2002 - Cours 1.2
Cours de C++, en français, 2002 - Cours 1.2Laurent BUNIET
 
Cours de C++, en français, 2002 - Cours 1.1
Cours de C++, en français, 2002 - Cours 1.1Cours de C++, en français, 2002 - Cours 1.1
Cours de C++, en français, 2002 - Cours 1.1Laurent BUNIET
 
Cours de C++, en français, 2002 - Plan
Cours de C++, en français, 2002 - PlanCours de C++, en français, 2002 - Plan
Cours de C++, en français, 2002 - PlanLaurent BUNIET
 

Plus de Laurent BUNIET (13)

Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5Cours de C++, en français, 2002 - Cours 3.5
Cours de C++, en français, 2002 - Cours 3.5
 
Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4Cours de C++, en français, 2002 - Cours 3.4
Cours de C++, en français, 2002 - Cours 3.4
 
Cours de C++, en français, 2002 - Cours 3.3
Cours de C++, en français, 2002 - Cours 3.3Cours de C++, en français, 2002 - Cours 3.3
Cours de C++, en français, 2002 - Cours 3.3
 
Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5Cours de C++, en français, 2002 - Cours 2.5
Cours de C++, en français, 2002 - Cours 2.5
 
Cours de C++, en français, 2002 - Cours 2.4
Cours de C++, en français, 2002 - Cours 2.4Cours de C++, en français, 2002 - Cours 2.4
Cours de C++, en français, 2002 - Cours 2.4
 
Cours de C++, en français, 2002 - Cours 2.3
Cours de C++, en français, 2002 - Cours 2.3Cours de C++, en français, 2002 - Cours 2.3
Cours de C++, en français, 2002 - Cours 2.3
 
Cours de C++, en français, 2002 - Cours 2.2
Cours de C++, en français, 2002 - Cours 2.2Cours de C++, en français, 2002 - Cours 2.2
Cours de C++, en français, 2002 - Cours 2.2
 
Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1
 
Cours de C++, en français, 2002 - Cours 1.5
Cours de C++, en français, 2002 - Cours 1.5Cours de C++, en français, 2002 - Cours 1.5
Cours de C++, en français, 2002 - Cours 1.5
 
Cours de C++, en français, 2002 - Cours 1.3
Cours de C++, en français, 2002 - Cours 1.3Cours de C++, en français, 2002 - Cours 1.3
Cours de C++, en français, 2002 - Cours 1.3
 
Cours de C++, en français, 2002 - Cours 1.2
Cours de C++, en français, 2002 - Cours 1.2Cours de C++, en français, 2002 - Cours 1.2
Cours de C++, en français, 2002 - Cours 1.2
 
Cours de C++, en français, 2002 - Cours 1.1
Cours de C++, en français, 2002 - Cours 1.1Cours de C++, en français, 2002 - Cours 1.1
Cours de C++, en français, 2002 - Cours 1.1
 
Cours de C++, en français, 2002 - Plan
Cours de C++, en français, 2002 - PlanCours de C++, en français, 2002 - Plan
Cours de C++, en français, 2002 - Plan
 

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

  • 2. Cours semaine 3 jour 1 Cours C++ 2 Plan du jour  ActiveX
  • 3. Cours semaine 3 jour 1 Cours C++ 3 Présentation d’ActiveX  ActiveX est une technologie purement Microsoft, ne fonctionnant que sur les plate- formes Microsoft  Cependant, les idées qui s’y trouvent sont partagées par beaucoup  Développement de composants  Réutilisabilité des composants pour la composition d’applications
  • 4. Cours semaine 3 jour 1 Cours C++ 4 Présentation d’ActiveX (2)  La première solution permettant de greffer une application sur Windows consistait à utiliser des DLL, Dynamic Link Libraries  Permet de partager du code entre plusieurs applications, le code est normalement moins bogué car plus utilisé  Facilité de mise à jour avec une copie en un endroit, copie qui peut être remplacée sans réaliser une édition de liens
  • 5. Cours semaine 3 jour 1 Cours C++ 5 Présentation d’ActiveX (3)  Plusieurs manière de lier une application à une ou plusieurs DLL :  Early binding : au lancement d’un programme qui l’utilise, les DLL sont chargées en mémoire  Run-Time Binding : une DLL est chargée en mémoire losrque le programme en a besoin  Toutes les DLL ont un DllMain() pour l’initialisation et la terminaison
  • 6. Cours semaine 3 jour 1 Cours C++ 6 Présentation d’ActiveX (4)  Toutes les méthodes d’une DLL peuvent être exportées  Les données d’une DLL peuvent être privées ou exportées  Une DLL peut être ou non liée aux MFC  Elle peut utiliser les services fournis par mfcXX.dll ou pas  Il existe des DLL régulières (interfaces C, même pour VisualBasic) et des DLL étendues (interfaces C++, permettant de construire des objets)
  • 7. Cours semaine 3 jour 1 Cours C++ 7 Présentation d’ActiveX (5)  Dans les DLL :  AFX_MANAGE_STATE( AfxGetStaticModuleState() ); dans chaque méthode qui utilise des MFC  Déclaration des méthodes et données exportées par _dllspec( dllexport ) int MaFonc( int x );  Dans les programmes utilisant la DLL :  _dllspec( dllimport ) int MaFonc( int x ); pour utiliser une fonction de la DLL
  • 8. Cours semaine 3 jour 1 Cours C++ 8 Présentation d’ActiveX (6)  ActiveX est une évolution de solutions déjà existantes chez Microsoft  Windows 16 bits : DDE, Dynamic Data Exchange, permet l’échange de données entre deux applications  Puis OLE, Object Linking and Embedding, utilisant une approche objet : possibilité d’intégrer dans une application des objets issus d’autres applications Windows
  • 9. Cours semaine 3 jour 1 Cours C++ 9 Présentation d’ActiveX (7) OLE : composition, stockage, échange et intégration de documents Microsoft Application 1 Application 2 Application 1 Application 2DDE OLE
  • 10. Cours semaine 3 jour 1 Cours C++ 10 Présentation d’ActiveX (8)  Avec OLE, il est possible d’embarquer un document rattaché à une application dans un autre document rattaché à une autre application  Un tableau Excel dans un document Word  Cependant, si l’on modifie le document embarqué, on lance l’application responsable dans une autre fenêtre
  • 11. Cours semaine 3 jour 1 Cours C++ 11 Présentation d’ActiveX (9)  Puis OLE 2, corrections des défauts d’OLE (…) et introduction du modèle COM, Component Object Model  OLE 2 et COM étant disponibles, Microsoft introduit alors la notion de composants OLE, OCX, OLE Control eXtension  Utilisable au départ avec les extensions VBX de VisualBasic, prédécesseur d’OCX
  • 12. Cours semaine 3 jour 1 Cours C++ 12 Présentation d’ActiveX (10)  Avec OLE 2, il est encore (…) possible d’embarquer un document dans un autre d’un type différent  Cette fois, le document embarqué sera modifié à l’intérieur de l’autre  Si l’on modifie un document Excel dans un document Word, le document Word reste visible « autour » du document Excel. L’utilisateur n’a pas l’impression de quitter Word mais Excel est lancé et s’occupe de la gestion graphique et remplace les menus de l’application du document englobant par ses propres menus
  • 13. Cours semaine 3 jour 1 Cours C++ 13 Présentation d’ActiveX ()
  • 14. Cours semaine 3 jour 1 Cours C++ 14 Présentation d’ActiveX ()
  • 15. Cours semaine 3 jour 1 Cours C++ 15 Présentation d’ActiveX (13)  Les OCX sont basés sur OLE 2 mais ne sont pas restreints aux documents  La technique d’insertion de ressources graphiques est étendue à tout type de programmes  Un OCX est plus qu’une DLL car il fournit le code, les ressources graphiques mais également les mécanismes de gestion des ressources graphiques et du comportement
  • 16. Cours semaine 3 jour 1 Cours C++ 16 Présentation d’ActiveX (14)  Remarque : le modèle COM adhère aux idées théoriques relatives à la création, à la distribution et à la réutilisation de composants.  COM a été développé par Digital (DEC)… COM est d’ailleurs disponible sur OpenVMS !  Rappelez vous que Windows NT (3.51…) est également l’héritier direct de VMS, écrit par Digital ?
  • 17. Cours semaine 3 jour 1 Cours C++ 17 Présentation d’ActiveX (15)  Il existe également une version Solaris (l’Unix de Sun) et une version True64Unix disponible auprès de l’OpenGroup  Seul problème : la licence coûte 35.000 dollars US pour 5 postes !  Mais pour ce prix là, on vous livre les sources ! Il y a donc moyen de déboguer…
  • 18. Cours semaine 3 jour 1 Cours C++ 18 Présentation d’ActiveX (16)  ActiveX utilise (respecte) COM ou DCOM (Distributed COM) pour la communication  Comparaison frustre par rapport à CORBA : CORBA OLE Couche de transport ORB COM (local) DCOM (réseau) vendeurs nombre incalculable Microsoft
  • 19. Cours semaine 3 jour 1 Cours C++ 19 Présentation d’ActiveX (17)  Il est souvent question de contrôles ActiveX  Il ne s’agit ni plus ni moins que de l’utilisation d’ActiveX (d’OCX) dans des pages HTML  Équivalent aux plug-ins de Netscape  Permet de lancer une application au sein d’une page HTML ou en lieu et place d’une page HTML  Un document Word, PDF, Powerpoint peut être visionné dans Internet Explorer  Même la machine virtuelle Java est un contrôle ActiveX pour Internet Explorer !  Peut s’utiliser avec ActiveX Scripting
  • 20. Cours semaine 3 jour 1 Cours C++ 20 Présentation d’ActiveX (18)  ActiveX Automation est le nouveau nom d’OLE Automation  Permet à une application Word ou Visual Basic d’accèder à des objets COM  Il s’agit d’objets de base sans rapport avec la notion de Document/View
  • 21. Cours semaine 3 jour 1 Cours C++ 21 Présentation d’ActiveX (19)  DocObject, ou Document Object, ou ActiveX document, permet d’afficher un document à l’intérieur d’un autre  En quelque sorte, OLE 3.0  Une application peut être un serveur DocObjet tandis qu’une autre sera un client DocObjet  Internet Explorer est un client DocObjet pour de nombreuses applications
  • 22. Cours semaine 3 jour 1 Cours C++ 22 Présentation d’ActiveX (20)  Avantages d’ActiveX  Migration rapide d’OLE 2.0 vers DocObject (mais pas d’OCX vers DocObject…)  Dans IE, rapidité des contrôles ActiveX qui sont compilés en binaire (Java est compilé mais doit encore être interprété par la JVM)  Intégration complète avec le système Win32  Un ActiveX peut effectuer des tâches d’administration : c’est bien s’il ne s’agit pas d’un virus, d’un vers ou d’un cheval de Troie…
  • 23. Cours semaine 3 jour 1 Cours C++ 23 Présentation d’ActiveX (21)  Inconvénients d’ActiveX  Portabilité discutable : il faut une version d’un ActiveX pour 95/NT, une pour NT MIPS, une pour Macintosh  Bien plus faible sécurité que Java. Offre une signature de contrôle mais passée cette sécurité, un ActiveX peut TOUT faire  InternetExploder permet de rebooter Windows dès qu’il est appelé dans une page HTML
  • 24. Cours semaine 3 jour 1 Cours C++ 24 COM / DCOM  COM et DCOM sont à la base des composants ActiveX  Il est impossible de faire des ActiveX sans !  Du point de vue de Microsoft, cela offre une interface de programmation unifiée  En local (COM), mélange des DLL et de l’IPC, Inter Process Communication  En distribué, idem mais le « fil » est plus long : RPC, Remote Procedure Call
  • 25. Cours semaine 3 jour 1 Cours C++ 25 COM / DCOM (2)  COM est un standard de communication  COM est un framework permettant de créer et d’utiliser des composants  Les composants remplissent les slots vides du framework
  • 26. Cours semaine 3 jour 1 Cours C++ 26 COM / DCOM (3)  COM est un « standard » défini au niveau binaire  N’importe quel langage  N’importe quel endroit (intra-process, inter- process et inter-machine)  Les performances du modèle intra-process ne doivent pas être dégradées par rapport à la solution DLL
  • 27. Cours semaine 3 jour 1 Cours C++ 27 COM / DCOM (4)  Principes de COM  Utilisation d’interfaces pour implémenter des comportements  Toute manipulation du composant se fait à travers une interface  Un objet COM peut implémenter plusieurs interfaces simultanéement  Le composant lui-même est une boite noire
  • 28. Cours semaine 3 jour 1 Cours C++ 28 COM / DCOM (5) Serveur COM Object IUnknown DoFirstFunction() DoOtherFunction( ) DoMyVeryLastFunction( ) IRobot IDispatch
  • 29. Cours semaine 3 jour 1 Cours C++ 29 COM / DCOM (6)  En définissant un objet COM, il faut obligatoirement implémenter certaines interfaces obligatoires  Elles permettent de faire le lien avec les mécanismes se trouvant dans la librairie COM  D’autres interfaces peuvent être définies pour donner sa spécificité au composant
  • 30. Cours semaine 3 jour 1 Cours C++ 30 COM / DCOM (7)  Les interfaces permettent de spécifier le contrat de l’objet  Comme pour les ADT  Elles définissent les comportements, pas les états  Elles sont identifiées par un IID, Interface ID  Elles doivent dériver de IUnknown  Sorte de super interface, équivalent d’une super classe Object qui n’existe pas en C++  La syntaxe d’une interface est définie dans une librairie de types (définition des entrées et des sorties)
  • 31. Cours semaine 3 jour 1 Cours C++ 31 COM / DCOM (8)  Les interfaces  Sont immuables  Pour modifier une interface, il faut en créer une nouvelle avec un nouveau numéro de version  Renvoient généralement un résultat HRESULT (un type Windows)  Attention au problème des passages par valeur et des passages par référence  Attention à la taille des objets envoyés
  • 32. Cours semaine 3 jour 1 Cours C++ 32 COM / DCOM (9)  Les classes qui implémentent les interfaces sont des classes COM  Elles possèdent un nom  Elles contiennent l’implémentation  Elles sont identifiées par un CLSID, Class ID  Les objets COM sont des instances de la classe COM  Les composants COM sont des ensembles avec les interfaces, le code, etc
  • 33. Cours semaine 3 jour 1 Cours C++ 33 COM / DCOM (10) Operating System Application Operating System Application Application DLL Différentes physionomies d’appels
  • 34. Cours semaine 3 jour 1 Cours C++ 34 COM / DCOM (11)  L’architecture de Microsoft se veut transparente pour les appels  Les objets s’appellent de la même manière quelle que soit leur localisation  Le cas le plus rapide correspond au cas où les composants se trouvent dans une DLL qui est utilisée de la même manière que ce qui a été vu précédemment
  • 35. Cours semaine 3 jour 1 Cours C++ 35 COM / DCOM (12)  En fait :  L’intra-process se fait grâce aux DLL  L’inter-process se fait grâce aux EXE  Les DLL continuent à ressembler à des DLL, mais se sont désormais des objets COM
  • 36. Cours semaine 3 jour 1 Cours C++ 36 COM / DCOM (13) Inprocess Client Composant COM runtime COM runtime DCOM network protocol Remote Local IPC Security provider RPC Protocol stack Security provider RPC Protocol stack
  • 37. Cours semaine 3 jour 1 Cours C++ 37 COM / DCOM (14) Client Composant Client ComposantCOM Processus client Processus serveur COM DCE RPC Client ServeurClient COM Composant Inprocess : appel rapide et direct des fonctions Local : sur une même machine, appel rapide Remote : distribué : appel de l’objet résidant sur une autre machine
  • 38. Cours semaine 3 jour 1 Cours C++ 38 COM / DCOM (15)  Pour le RPC dans DCOM, DCE-RPC est utilisé  DCE signifie Distributed Computing Environment  Il s’agit de la première tentantive industrielle de communication inter-systèmes  Elle a eu très peu de succès (très lourd)  CORBA s’en est aussi inspiré pour aller plus loin (GIOP et IIOP)…
  • 39. Cours semaine 3 jour 1 Cours C++ 39 COM / DCOM (16)  Ce que COM/DCOM assure pour vous :  Sécurité (mais pas complètement ! Rappelez vous les problèmes des contrôles ActiveX)  Informations sur le type (répertoire des interfaces disponibles : Interface Repository)  Information sur le nommage : nom de l’objet rattaché à son emplacement, processus de naming assuré par des monikers chez Microsoft
  • 40. Cours semaine 3 jour 1 Cours C++ 40 COM / DCOM (17)  Ce que COM/DCOM assure pour vous (2) :  Invocation dynamique (dynamic invocation) qui est baptisée automation  Transfert de données : il s’agit d’un protocole de transport après tout !  Gestion du registry (sert dans le processus de nommage)  Gestion des catégories de composants
  • 41. Cours semaine 3 jour 1 Cours C++ 41 COM / DCOM (18)  Ce que COM/DCOM assure pour vous (3) :  La gestion des transactions à condition d’avoir une base de données qui les supporte (ce n’est pas le cas d’Access mais de SQL Server, développé à partir de Sybase)  Les transactions distribuées nécessitent COM+  Communications asynchrones, à condition d’avoir le Microsoft Transaction Server
  • 42. Cours semaine 3 jour 1 Cours C++ 42 COM / DCOM (19) COM Runtime COM et DCOM Registry Securité (SSPI) NTLM Kerberos Norme de Transports DCE MS-RPC TCP UDP IPX SPX HTTP “Falcon” ETC... Services de base (Automation, Monikers, Storage, ComCat, Data Transfer, IR) Composants et Applications
  • 43. Cours semaine 3 jour 1 Cours C++ 43 COM / DCOM (20) Pointer to Method 1 Pointer to Method 6 Pointer to Method 3 Pointer to Method 4 Pointer to Method 5 Pointer to Method 2 MaFonction1() {...} MaFonction2() {...} MaFonction3() {...} MaFonction4() {...} MaFonction5() {...} MaFonction6() {...}VTABLE Client Objet Pointeur sur l‘interface Pointeur interne sur la VTABLE Réalisation d’un appel : Pointer to members ?
  • 44. Cours semaine 3 jour 1 Cours C++ 44 COM / DCOM (21)  Avant que le client ait le lien présenté vers l’interface, le système doit la trouver en fonction des informations fournies par le client  Processus mis en œuvre : nommage, gestion du registre, gestion du cycle de vie et transport des données
  • 45. Cours semaine 3 jour 1 Cours C++ 45 COM / DCOM (22) Client Serveur Objet Librairie COM CLSID_X CLSID_Y C:SERVER1.DLL C:SERVER2.EXE ... System registry 2 : COM localise et instancie le serveur 3 : un pointeur vers les interfaces de A est retourné par la librairie COM 4 : le client peut appeler des fonctions de A 1 : le client appelle CoCreateInstance ( CLSID_Y,IID_A ) A ...
  • 46. Cours semaine 3 jour 1 Cours C++ 46 COM / DCOM (23) objetProxy client Stub Processus client Processus serveur Même machine IPC En local :
  • 47. Cours semaine 3 jour 1 Cours C++ 47 COM / DCOM (24) objetProxy client Stub Processus client Processus serveur Machine X Machine Y RPC En remote :
  • 48. Cours semaine 3 jour 1 Cours C++ 48 COM / DCOM (25)  Les proxy et les stub sont des classes qui sont parfois qualifiées de helpers  Ils effectuent l’encodage binaire de l’information pour l’envoyer sur le « fil » du côté de l’émetteur  Ils effectuent le décodage du stream binaire de l’autre côté du fil pour récupérer l’information  Les principes sont les même dans tous les environnements de distribution objets
  • 49. Cours semaine 3 jour 1 Cours C++ 49 COM / DCOM (26)  Pour respecter la théorie, on parle de  Marshalling pour l’encodage du message binaire  Unmarshalling pour le décodage du message binaire  Une fois le codage effectué, il est possible d’envoyer le flux sur de nombreux types de protocoles de transport de bas niveau
  • 50. Cours semaine 3 jour 1 Cours C++ 50 COM / DCOM (27) TCP, UDP IPX, SPX HTTP ServeurClient C O MQueued Clients C O M Objet COM Différentes normes de transport :
  • 51. Cours semaine 3 jour 1 Cours C++ 51 COM / DCOM (28)  Les proxy et les stubs doivent, bien évidemment, se comprendre parfaitement de chaque côté du fil  Ils doivent comprendre les messages de la même manière, exactement  Pour éviter les problèmes, ils sont définis à partir d’un seul et même fichier  Fichier (M)IDL, Microsoft Interface Definition Language
  • 52. Cours semaine 3 jour 1 Cours C++ 52 COM / DCOM (29) Définition d‘interface et de librairies en IDL Compilateur MIDL Proxies Type library (.tlb)Stubs Autres fichiers
  • 53. Cours semaine 3 jour 1 Cours C++ 53 COM / DCOM (30)  Attention aux différences de vocabulaire !  L’IDL de Microsoft n’est pas l’IDL de CORBA  Avant l’IDL, Microsoft avait l’ODL et a maintenant le MIDL (IDL de CORBA semble registered)  Le client Microsoft utilise un proxy et le serveur Microsoft utilise un stub  Le client CORBA utilise un stub et le serveur CORBA utilise un skeleton
  • 54. Cours semaine 3 jour 1 Cours C++ 54 ATL  Active Template Library  Nous en avons déjà parlé… De même que de la WTL  ATL est une librairie bien plus légère que MFC qui permet de développer de petits composants ayant des capacités d’exécution plus rapide que les applications MFC  Mais certains développements ATL utilisent MFC…
  • 55. Cours semaine 3 jour 1 Cours C++ 55 ATL (2)  ATL version 1 apportait le support de IUnknown, IClassFactory (une autre manière de créer un objet), IDispatch, IConnectionPointContainer et les énumérations COM  ATL version 2 : améliorations et support des contrôles ActiveX  ATL version 3 : améliorations…
  • 56. Cours semaine 3 jour 1 Cours C++ 56 ATL (3)  ATL est normalement fait pour être utilisée en conjonction avec la STL, cette dernière fournissant les strings et collections qui ne se trouvent pas dans ATL
  • 57. Cours semaine 3 jour 1 Cours C++ 57 ATL (4)  La gestion des évènements se fait à travers un connection point qui a besoin  D’une source qui envoie des évènements  Interface IConnectionPoint  Plusieurs sources d’un objet dans un IConnectionPoint Container  D’un réceptacle (sink) qui les reçoit  D’un mécanisme qui permet d’attacher la source à son réceptacle
  • 58. Cours semaine 3 jour 1 Cours C++ 58 ATL (5)  Supposons que nous utilisons la classe COM “Exemple”  Templates source disponibles dans ATL  IConnectionPointContainerImpl<CExemple>  Cproxy_IExempleEvents<CExemple>  BEGIN_COM_MAP et BEGIN_CONNECTION_POINT_MAP
  • 59. Cours semaine 3 jour 1 Cours C++ 59 ATL (6)  Template réceptacle  Implémentation de l’interface IDispEventImpl<>  Enregistrement du mécanisme avec IConnectionPoint::Advise et IConnectioPoint::Unadvise
  • 60. Cours semaine 3 jour 1 Cours C++ 60 ATL (7)  Création d’un ActiveX  Création du squelette du contrôle (AppWizard)  Ajout de propriétés accessibles depuis l’extérieur (ClassWizard)  Ajout de méthodes : définition des actions du contrôleur  Ajout d’évènements : gestion des évènements utilisateur  Signature du code : certificat d’authentification
  • 61. Cours semaine 3 jour 1 Cours C++ 61 ATL (8)  Pattern d’utilisation d’un ActiveX: void f( void ) { IUnknown* pUnk = 0; // 0 pour NULL // demande de création HRESULT hr = DemandeUnObjet( &pUnk ); if( SUCCEEDED( hr ) ) { // utilisation de l’objet obtenu UneFonction( pUnk ); } // libération pUnk->release() }
  • 62. Cours semaine 3 jour 1 Cours C++ 62 ATL (9)
  • 63. Cours semaine 3 jour 1 Cours C++ 63 ATL (10)
  • 64. Cours semaine 3 jour 1 Cours C++ 64 ATL (11) Le serveur COM sera une DLL L’initialisation de la DLL se fera là L’IDL à compléter est là
  • 65. Cours semaine 3 jour 1 Cours C++ 65 ATL ()
  • 66. Cours semaine 3 jour 1 Cours C++ 66 ATL ()
  • 67. Cours semaine 3 jour 1 Cours C++ 67 ATL ()
  • 68. Cours semaine 3 jour 1 Cours C++ 68 ATL (15)
  • 69. Cours semaine 3 jour 1 Cours C++ 69 ATL (16)
  • 70. Cours semaine 3 jour 1 Cours C++ 70 ATL (17)
  • 71. Cours semaine 3 jour 1 Cours C++ 71 ATL (18)
  • 72. Cours semaine 3 jour 1 Cours C++ 72 ATL (19)
  • 73. Cours semaine 3 jour 1 Cours C++ 73 ATL ()
  • 74. Cours semaine 3 jour 1 Cours C++ 74 ATL (21)
  • 75. Cours semaine 3 jour 1 Cours C++ 75 ATL ()
  • 76. Cours semaine 3 jour 1 Cours C++ 76 ATL ()
  • 77. Cours semaine 3 jour 1 Cours C++ 77 ATL ()
  • 78. Cours semaine 3 jour 1 Cours C++ 78 ATL (25)  Nous avons désormais un objet COM qui fonctionne !  Il est dans une DLL  Il possède une méthode  Il est enregistré dans le système  Sauvez tous les fichiers et fermez le Workspace courant
  • 79. Cours semaine 3 jour 1 Cours C++ 79 ATL (26)  Dans le répertoire ProjectsSimple_ATL, cherchez le fichier Simple_ATL_i.c  Copier/coller les lignes suivantes dans un fichier avec WordPad ou NotePad :  const IID IID_IFirst_ATL = {0x6E236158,0xB1E0,0x4440,{0xB8,0xA0, 0x24,0xA1,0x1F,0xCA,0xCA,0x98}};  const CLSID CLSID_First_ATL = {0xE5EBE21E,0x50D1,0x438D,{0xB8,0x48, 0x0D,0xA4,0x47,0x72,0x8C,0xE3}};  Les valeurs que vous aurez seront différentes de celles présentées ici !
  • 80. Cours semaine 3 jour 1 Cours C++ 80 ATL (27)  Nous allons maintenant créer un programme client simple  Pour ne pas perdre les bonne habitudes, nous allons utiliser une Windows 32 console Application qui sera exécutée dans une fenêtre Shell
  • 81. Cours semaine 3 jour 1 Cours C++ 81 ATL (28)
  • 82. Cours semaine 3 jour 1 Cours C++ 82 ATL (29)
  • 83. Cours semaine 3 jour 1 Cours C++ 83 ATL (30)
  • 84. Cours semaine 3 jour 1 Cours C++ 84 ATL (31) #include "..Simple_ATLSimple_ATL.h" #include <iostream.h> const IID IID_IFirst_ATL = // valeur dans Simple_ATL_i.c const CLSID CLSID_First_ATL = // valeur dans Simple_ATL_i.c void main( void ) { HRESULT hr; IFirst_ATL *IFirstATL; hr = CoInitialize( 0 );
  • 85. Cours semaine 3 jour 1 Cours C++ 85 ATL (32) if( SUCCEEDED( hr ) ) { hr = CoCreateInstance( CLSID_First_ATL, NULL, CLSCTX_INPROC_SERVER, IID_IFirst_ATL, (void**) &IFirstATL ); if( SUCCEEDED( hr ) ) { long ReturnValue; hr = IFirstATL->AddNumbers( 5, 7, &ReturnValue );
  • 86. Cours semaine 3 jour 1 Cours C++ 86 ATL (33) cout << "la somme de 5 + 7 est : "; cout << ReturnValue << endl; hr = IFirstATL->Release(); } else { cout << "CoCreateInstance : echec."; cout << endl; } } CoUninitialize(); }
  • 87. Cours semaine 3 jour 1 Cours C++ 87 ATL ()
  • 88. Cours semaine 3 jour 1 Cours C++ 88 ATL (35)
  • 89. Cours semaine 3 jour 1 Cours C++ 89 ATL (36)  Copiez/collez la ligne de l’IID  Mettez une des deux lignes en commentaires pour conserver la bonne information  Dans l’autre ligne, modifier un seul chiffre, recompiler et exécutez
  • 90. Cours semaine 3 jour 1 Cours C++ 90 ATL (37)
  • 91. Cours semaine 3 jour 1 Cours C++ 91 ATL (38)  Le lien avec le serveur placé dans la DLL est donc fait à l’aide de l’IID et du CLSID  La moindre modification de ces chiffres fait perdre le lien  En fait, le lien obtenu à travers la registry est perdu
  • 92. Cours semaine 3 jour 1 Cours C++ 92 ATL (39)
  • 93. Cours semaine 3 jour 1 Cours C++ 93 ATL (40)  Les choses se compliquent un peu avec des exécutables à la place des DLL  Cela peut être pire si c’est distribué  C’est encore plus compliqué avec des MFC à côté des ATL  Microsoft Visual Studio fait la majeure partie du code pour vous  NE LE MODIFIER PAS !!!!!
  • 94. Cours semaine 3 jour 1 Cours C++ 94 Questions / Remarques