94
Cours C++ (2002) semaine 3 jour 1

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

Embed Size (px)

Citation preview

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

Cours C++ (2002)

semaine 3

jour 1

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

Cours semaine 3 jour 1 Cours C++ 2

Plan du jour

ActiveX

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

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

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

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

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

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

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

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)

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

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

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

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

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

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

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

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

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

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

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

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

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

Cours semaine 3 jour 1 Cours C++ 13

Présentation d’ActiveX ()

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

Cours semaine 3 jour 1 Cours C++ 14

Présentation d’ActiveX ()

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

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

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

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 ?

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

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…

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

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

transportORB

COM (local)

DCOM (réseau)

vendeursnombre

incalculableMicrosoft

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

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

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

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

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

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

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

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…

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

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

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

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

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

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

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

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

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

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

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

Cours semaine 3 jour 1 Cours C++ 28

COM / DCOM (5)

Serveur

COM

Object

IUnknown

DoFirstFunction()

DoOtherFunction( )

DoMyVeryLastFunction( )

IRobot

IDispatch

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

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

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

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)

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

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

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

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

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

Cours semaine 3 jour 1 Cours C++ 33

COM / DCOM (10)

Operating System

Application Operating System

Application

Application

DLL

Différentes physionomies d’appels

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

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

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

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

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

Cours semaine 3 jour 1 Cours C++ 36

COM / DCOM (13)

InprocessClient Composant

COM

runtime

COM

runtime

DCOM network

protocol

Remote

Local

IPC

Security

providerRPC

Protocol stack

Security

providerRPC

Protocol stack

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

Cours semaine 3 jour 1 Cours C++ 37

COM / DCOM (14)

Client Composant

Client ComposantCOM

Processus client Processus serveur

COMDCE

RPCClient

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

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

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)…

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

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

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

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

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

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

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

Cours semaine 3 jour 1 Cours C++ 42

COM / DCOM (19)

COM Runtime

COM et DCOM Registry

Securité(SSPI)

NTLM

KerberosNorme 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

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

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

ClientObjet

Pointeur sur

l‘interface

Pointeur interne

sur la

VTABLE

Réalisation d’un appel :Pointer to members ?

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

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

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

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 registry2 : 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

...

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

Cours semaine 3 jour 1 Cours C++ 46

COM / DCOM (23)

objetProxyclient Stub

Processus client Processus serveur

Même machine

IPC

En local :

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

Cours semaine 3 jour 1 Cours C++ 47

COM / DCOM (24)

objetProxyclient Stub

Processus client Processus serveur

Machine X Machine Y

RPC

En remote :

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

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

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

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

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

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 :

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

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

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

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

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

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

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

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…

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

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…

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

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

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

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

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

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

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

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

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

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

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

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()

}

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

Cours semaine 3 jour 1 Cours C++ 62

ATL (9)

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

Cours semaine 3 jour 1 Cours C++ 63

ATL (10)

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

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à

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

Cours semaine 3 jour 1 Cours C++ 65

ATL ()

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

Cours semaine 3 jour 1 Cours C++ 66

ATL ()

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

Cours semaine 3 jour 1 Cours C++ 67

ATL ()

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

Cours semaine 3 jour 1 Cours C++ 68

ATL (15)

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

Cours semaine 3 jour 1 Cours C++ 69

ATL (16)

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

Cours semaine 3 jour 1 Cours C++ 70

ATL (17)

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

Cours semaine 3 jour 1 Cours C++ 71

ATL (18)

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

Cours semaine 3 jour 1 Cours C++ 72

ATL (19)

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

Cours semaine 3 jour 1 Cours C++ 73

ATL ()

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

Cours semaine 3 jour 1 Cours C++ 74

ATL (21)

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

Cours semaine 3 jour 1 Cours C++ 75

ATL ()

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

Cours semaine 3 jour 1 Cours C++ 76

ATL ()

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

Cours semaine 3 jour 1 Cours C++ 77

ATL ()

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

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

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

Cours semaine 3 jour 1 Cours C++ 79

ATL (26)

Dans le répertoire Projects\Simple_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 !

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

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

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

Cours semaine 3 jour 1 Cours C++ 81

ATL (28)

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

Cours semaine 3 jour 1 Cours C++ 82

ATL (29)

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

Cours semaine 3 jour 1 Cours C++ 83

ATL (30)

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

Cours semaine 3 jour 1 Cours C++ 84

ATL (31)

#include "..\Simple_ATL\Simple_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 );

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

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 );

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

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();

}

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

Cours semaine 3 jour 1 Cours C++ 87

ATL ()

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

Cours semaine 3 jour 1 Cours C++ 88

ATL (35)

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

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

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

Cours semaine 3 jour 1 Cours C++ 90

ATL (37)

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

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

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

Cours semaine 3 jour 1 Cours C++ 92

ATL (39)

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

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 !!!!!

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

Cours semaine 3 jour 1 Cours C++ 94

Questions / Remarques