programmation système et com/dcom sous...

26
Programmation Programmation système et COM/DCOM système et COM/DCOM sous Windows sous Windows 2006/2007 2006/2007 Marius VASILIU Marius VASILIU

Upload: vulien

Post on 06-Mar-2019

267 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

ProgrammationProgrammationsystème et COM/DCOMsystème et COM/DCOM

sous Windowssous Windows

2006/20072006/2007

Marius VASILIUMarius VASILIU

Page 2: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Programmation avancéeProgrammation avancée(non(non--graphique)graphique)

�� Évolution des techniques COM/DCOMÉvolution des techniques COM/DCOM�� Avantages de l’automationAvantages de l’automation�� Langages de programmation, scriptsLangages de programmation, scripts�� Approche objet en COM/DCOM, interfaces Approche objet en COM/DCOM, interfaces �� API Win32 systèmeAPI Win32 système�� Mise en place de l’accès aux serveurs d’automationMise en place de l’accès aux serveurs d’automation�� Approche C++Approche C++�� Approche VBScript et Approche VBScript et JScriptJScript, comme scripts , comme scripts

indépendants ou dans des pages indépendants ou dans des pages WebWeb (dans (dans Internet Explorer)Internet Explorer)

Page 3: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

COM/DCOMCOM/DCOMBref rappel historiqueBref rappel historique

–– DDEDDE ((DynamicDynamic datadata exchangeexchange)) : échange de données entre : échange de données entre une application client et une application maître (exemple une application client et une application maître (exemple Matlab Matlab 4.x)4.x)

–– OLE1OLE1 (Objet (Objet Link EmbededLink Embeded v1)v1) : insertion d'un objet géré : insertion d'un objet géré par le serveur à l'intérieur du client (conteneur). La par le serveur à l'intérieur du client (conteneur). La modification se fait par click à l'intérieur de la fenêtre du modification se fait par click à l'intérieur de la fenêtre du serveur, avec ses menus à lui (ex. Word 6 et l'Editeur serveur, avec ses menus à lui (ex. Word 6 et l'Editeur d'équations 1.0)d'équations 1.0)

–– OLE2OLE2 (Objet(Objet Link EmbededLink Embeded v2)v2) : insertion d'un objet géré : insertion d'un objet géré par le serveur à l'intérieur du client (conteneur). La par le serveur à l'intérieur du client (conteneur). La modification se fait par click à l'intérieur de la fenêtre du modification se fait par click à l'intérieur de la fenêtre du client, qui change ou fusionne ses menus avec le serveur.client, qui change ou fusionne ses menus avec le serveur.

Page 4: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

COM/DCOMCOM/DCOMBref rappel historiqueBref rappel historique

–– COMCOM : technologie de communication entre des objets : technologie de communication entre des objets composants : un objet peut exposer plusieurs interfaces, composants : un objet peut exposer plusieurs interfaces, mais tous doivent supporter mais tous doivent supporter IUnknownIUnknown. Une interface a . Une interface a des propriétés (attributs), des méthodes avec des des propriétés (attributs), des méthodes avec des paramètres normalisées, des constantes et des paramètres normalisées, des constantes et des definitions definitions de type (de type (typedefstypedefs). Elle est décrite en langage ). Elle est décrite en langage MIDLMIDL(inspiré du C/C++). Communication limitée sur une seule (inspiré du C/C++). Communication limitée sur une seule machine.machine.

–– DCOMDCOM : suite de COM étendue à la communication entre : suite de COM étendue à la communication entre des objets sur plusieurs machines (l'objet serveur peut des objets sur plusieurs machines (l'objet serveur peut être à distance : LAN/WAN)être à distance : LAN/WAN)

–– COM+COM+ : évolution de COM/DCOM sous : évolution de COM/DCOM sous WindowsXPWindowsXP/.Net/.Net

Page 5: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

ActiveX ActiveX / / DirectXDirectXBref rappel historiqueBref rappel historique

–– ActiveXActiveX : classe de composants COM/DCOM qui : classe de composants COM/DCOM qui supportent normalement les normes OLE et ont deux supportent normalement les normes OLE et ont deux aspects : contrôles et documents. Les contrôles aspects : contrôles et documents. Les contrôles ActiveXActiveXsont aussi les héritiers des anciens contrôles VBX de sont aussi les héritiers des anciens contrôles VBX de VisualBasicVisualBasic. Essentiellement utilisés dans des documents . Essentiellement utilisés dans des documents Web Web (HTML / VBScript / (HTML / VBScript / JScriptJScript), installation à distance ), installation à distance par protocole HTTP à partir d'un serveur. par protocole HTTP à partir d'un serveur.

–– DirectXDirectX (Direct 3D/(Direct 3D/DrawDraw/Input/Audio/Music//Input/Audio/Music/PlayPlay/Show) /Show) : : interface multimédia composée d'objets COM qui sert à interface multimédia composée d'objets COM qui sert à accélérer l'accès aux périphériques IHM: carte graphique / accélérer l'accès aux périphériques IHM: carte graphique / son / réseau, joystick, son / réseau, joystick, codecscodecs etc. Utilisé par les jeux etc. Utilisé par les jeux (locaux/réseau), applications multimédia (enregistrement, (locaux/réseau), applications multimédia (enregistrement, streamingstreaming, DVD, réalité virtuelle, , DVD, réalité virtuelle, WinWin Media, Real Media). Media, Real Media).

Page 6: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

COM/DCOMCOM/DCOMapproche objetapproche objet

�� Un client peut faire Un client peut faire appel à un serveur appel à un serveur DCOM situé sur un DCOM situé sur un autre PC.autre PC.

réseau TCP/IP

Application

Win32 cliente

COM/DCOM

Interface

DCOM

Interface

COM

Interface

DCOM

Interface

COM

� �

Page 7: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

COM/DCOMCOM/DCOMapproche objetapproche objet

�� Un composant Un composant COM/DCOM possède COM/DCOM possède plusieurs interfaces plusieurs interfaces COM/DCOMCOM/DCOM

�� Il possède au moins Il possède au moins l’interface l’interface IUnknownIUnknown !!

�� Pour répondre à Pour répondre à chaque protocole OLE1, chaque protocole OLE1, OLE2 ou OLE2 ou ActiveX ActiveX il doit il doit avoir d’autres interfaces avoir d’autres interfaces en plus. en plus.

Interface COM

Interface

COM COM

Interface

Objet OLE

ActiveX

DirectX

Page 8: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Enregistrement des interfaces Enregistrement des interfaces COM/DCOMCOM/DCOM

�� L'interface COM/DCOM est une collection de :L'interface COM/DCOM est une collection de :–– méthodes / événementsméthodes / événements–– attributsattributs–– typestypes–– constantes (énumérations)constantes (énumérations)

�� Chaque objet COM/DCOM possède un Chaque objet COM/DCOM possède un CLSIDCLSID (class ID) unique (class ID) unique de type GUID (global unique ID).de type GUID (global unique ID).

�� Chaque interface d'un objet COM/DCOM possède un Chaque interface d'un objet COM/DCOM possède un IIDIID(interface ID) unique de type GUID.(interface ID) unique de type GUID.

�� Plusieurs interfaces sont regroupées dans des "Plusieurs interfaces sont regroupées dans des "Type LibrariesType Libraries" " sous différents formats : *.sous différents formats : *.tlbtlb, *., *.olbolb, *., *.tlhtlh, *., *.tlitli, *., *.dlldll, *., *.exeexe

�� Tout est enregistré dans la base de registres WindowsTout est enregistré dans la base de registres Windows

Page 9: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Les GUIDsLes GUIDs

�� Un GUID est une structure C de 16 octets (128 bits) définie Un GUID est une structure C de 16 octets (128 bits) définie dans dans winntwinnt.h.h ::

typedef structtypedef struct _GUID {_GUID {DWORD Data1;DWORD Data1;WORD Data2;WORD Data2;WORD Data3;WORD Data3;BYTE Data4[8];BYTE Data4[8];

} GUID;} GUID;

�� Pour toute nouvelle interface on tire aléatoirement un GUID à Pour toute nouvelle interface on tire aléatoirement un GUID à l'aide de l'aide de GuidGenGuidGen (une chance (une chance ~2~2--128128 de conflit)de conflit)

�� Pour le déclarer on peut utiliser la macro DEFINE_GUID Pour le déclarer on peut utiliser la macro DEFINE_GUID définie dans définie dans objbaseobjbase.h.h ::

##definedefine DEFINE_GUID(DEFINE_GUID(namename,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) ,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \\externextern "C""C" constconst GUID GUID namename={l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}={l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}

Page 10: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

COM/DCOMCOM/DCOMapproche objetapproche objet

�� Tout objet possTout objet possèède une interface (par dde une interface (par dééfaut)faut) IUnknownIUnknown

�� �� l'application peut retrouver toute autre interface de l'objetl'application peut retrouver toute autre interface de l'objet

MMééthodes de l'interface thodes de l'interface IUnknownIUnknown

�� AddRefAddRef IncrIncréémente le compteur d'utilisation de l'objet suite au lien mente le compteur d'utilisation de l'objet suite au lien dynamique (dynamique (bindbind) ) àà une application ou une application ou àà un autre objet.un autre objet.

A la crA la crééation de compteur est initialisation de compteur est initialiséé àà 1.1.

Prototype : Prototype : ULONG ULONG AddRefAddRef();();

�� ReleaseRelease DDéécrcréémente le compteur d'utilisation de l'objet suite au lien mente le compteur d'utilisation de l'objet suite au lien dynamique (dynamique (bindbind) ) àà une application ou une application ou àà un autre objet.un autre objet.

Si le compteur arrive Si le compteur arrive àà 0 l'objet est d0 l'objet est déétruit automatiquement.truit automatiquement.

Prototype : Prototype : ULONG Release();ULONG Release();

�� QueryInterfaceQueryInterface Interroge sur la prInterroge sur la préésence d'une interface COMsence d'une interface COM riidriid. Si . Si elle existe, le compteur est increlle existe, le compteur est incréémentmentéé et l'on peut l'utiliser immet l'on peut l'utiliser imméédiatement diatement par l'intermpar l'interméédiaire du pointeur retourndiaire du pointeur retournéé dans dans pipi. . Prototype :Prototype : HRESULT HRESULT QueryInterfaceQueryInterface(REFIID (REFIID riidriid, LPVOID *pi);, LPVOID *pi);

Page 11: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Exploration des interfacesExploration des interfaces

�� Utiliser l'outil d'exploration "OLE Utiliser l'outil d'exploration "OLE ViewView" (Visual Studio/Outils)" (Visual Studio/Outils)

�� Explorez les branches Explorez les branches –– ObjectObject Classes Classes

–– Application Application IDsIDs

–– Type Type LibrariesLibraries

–– Interfaces Interfaces

�� Rechercher dans la branche Rechercher dans la branche InterfacesInterfaces l'interface appell'interface appelééeeIShellLinkDualIShellLinkDual. Relever les GUIDs de l'objet, de l'interface et de . Relever les GUIDs de l'objet, de l'interface et de la bibliothla bibliothèèque.que.

�� De quelles autres interfaces hDe quelles autres interfaces héériterite--tt--elle ?elle ?

�� MMêême chose pour l'interface me chose pour l'interface IShellLinkDual2IShellLinkDual2. Conclusion ?. Conclusion ?

�� Le langage de description des interfaces : MIDL dérivé de Le langage de description des interfaces : MIDL dérivé de C/C++.C/C++.

Page 12: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Accès à l'interface COMAccès à l'interface COMdans les langages interprétésdans les langages interprétés

�� Seulement les interfaces qui hSeulement les interfaces qui hééritent de l'interfaceritent de l'interface IDispatch IDispatch sont accessibles aux langages interprsont accessibles aux langages interprééttéées Java, VB ou encore es Java, VB ou encore les scripts (les scripts (JScriptJScript, VBScript etc.)., VBScript etc.).

�� IDispatchIDispatch posspossèède des mde des mééthodes spthodes spéécifiques :cifiques :

��GetIDsOfNames GetIDsOfNames : donnes les noms des param: donnes les noms des paramèètrestres��GetTypeInfo GetTypeInfo : donne des infos sur les types: donne des infos sur les types��GetTypeInfoCountGetTypeInfoCount : donne le nombre de param: donne le nombre de paramèètrestres�� Invoke Invoke : permet d'invoquer toute autre m: permet d'invoquer toute autre mééthode ou lire / thode ou lire /

éécrire un attributcrire un attribut

�� AvantageAvantage : appel ad: appel ad--hoc pendant l'interprhoc pendant l'interpréétationtation

�� InconvénientInconvénient : besoin d'une : besoin d'une TypeLibTypeLib enregistrenregistréée, tre, trèès lent s lent et inefficace (net inefficace (néégociation / vgociation / véérification / appels)rification / appels)

Page 13: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Accès à l'interface COMAccès à l'interface COMsous C++sous C++

�� Compatibilité binaire entre COM/DCOM et C++.Compatibilité binaire entre COM/DCOM et C++.

COM/DCOM Traduction dans un programme C++

Interface d'un objet COM Classe de base abstraite (toutes les méthodes pure virtual)

Pointeur d'interface ip

(retourné par QueryInterface)

Pointeur vers la vtable de l'objet

(tableau d'adresses des méthodes)

Méthode d'un objet COM Méthode d'un objet C++

Nom de l'objet COM Argument caché this à l'appel d'un méthode

Appel d'une méthode Indirection implicite par vtable

�� Création / destructionCréation / destruction� En C++ on crée et on détruit les objets en utilisant les opérateurs new et delete.

� Sous COM/DCOM le système compte le nombre d'utilisations des objets (nombre d'interfaces connectées) et gère leur création et leur destruction.

Page 14: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Comment avoir un pointeur Comment avoir un pointeur d'interface COM/DCOMd'interface COM/DCOM

��AttentionAttention : on peut avoir juste un pointeur vers l'interface : on peut avoir juste un pointeur vers l'interface (pointeur vers une classe C++ en langage C++) (pointeur vers une classe C++ en langage C++)

�� CrCrééation explicite d'un objet COM/DCOM :ation explicite d'un objet COM/DCOM :�� àà l'aide de l'aide de CoCreateInstanceCoCreateInstance

�� on demande en mon demande en mêême temps le pointeur d'une interfaceme temps le pointeur d'une interface

�� Interrogation sur une nouvelle interface d'un objet COM/DCOM Interrogation sur une nouvelle interface d'un objet COM/DCOM existant :existant :�� àà l'aide de l'aide de QueryInterfaceQueryInterface

�� il faut connail faut connaîître l'ID de l'autre interfacetre l'ID de l'autre interface

�� Appel d'une mAppel d'une mééthode qui retourne un pointeur d'interface :thode qui retourne un pointeur d'interface :�� soit du msoit du mêême objetme objet

�� soit d'un nouveau objet crsoit d'un nouveau objet créée pendant l'appele pendant l'appel

�� Appel d'une API dAppel d'une API déédidiéée : en e : en DirectX DirectX par exemple.par exemple.

Page 15: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Création d’un objetCréation d’un objetCOM sous C++COM sous C++

�� Il faut connaIl faut connaîître le tre le CLSIDCLSID de l'objet de l'objet COMCOM voulu :voulu :s'il est connu publiquement, il se trouve dans las'il est connu publiquement, il se trouve dans la docdoc ou dans un *.hou dans un *.h

�� Il faut initialiser le systIl faut initialiser le systèème me COMCOM explicitement en appelantexplicitement en appelant CoInitializeCoInitialize ::HRESULTHRESULT CoInitializeCoInitialize((

LPVOIDLPVOID pvReservedpvReserved );); // toujours nul// toujours nul

�� Appel explicite Appel explicite àà la fonctionla fonction CoCreateInstanceCoCreateInstance // CoCreateInstanceExCoCreateInstanceEx

(DCOM):(DCOM):STDAPISTDAPI CoCreateInstanceCoCreateInstance((

REFCLSIDREFCLSID rclsidrclsid,, // le CLSID du futur objet// le CLSID du futur objetLPUNKNOWNLPUNKNOWN pUnkOuterpUnkOuter,, // pointeur nul dans ce cas// pointeur nul dans ce casDWORDDWORD dwClsContextdwClsContext,, // = CLSCTX_INPROC_SERVER si// = CLSCTX_INPROC_SERVER si

// l'objet est une DLL // l'objet est une DLL àà exexéécuter avec le proc. courantcuter avec le proc. courantREFIIDREFIID riidriid,, // r// rééf. de l'ID de l'interface choisief. de l'ID de l'interface choisieLPVOID *LPVOID *ppvppv ););// adresse de retour de l'interface// adresse de retour de l'interface

�� A la fin, la fermeture du systA la fin, la fermeture du systèème me COMCOM, en appelant, en appelant CoUninitializeCoUninitialize ::void CoUninitializevoid CoUninitialize( );( );

Page 16: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Derrière une méthode Derrière une méthode COM/DCOM ...COM/DCOM ...

��Au bas niveau, chaque mAu bas niveau, chaque mééthode :thode :�� empile ses arguments dans un empile ses arguments dans un tableau d'argumentstableau d'arguments etet�� remplit un remplit un tableau de types d'argumentstableau de types d'arguments

��Chaque type d'argument COM/DCOM est codChaque type d'argument COM/DCOM est codéé ((éénumnuméération) :ration) :

OUIOUIOUIOUIOUIOUIOUIOUITrueTrue==--1,1, FalseFalse=0=01111VT_BOOLVT_BOOL

OUIOUIOUIOUIOUIOUIOUIOUIdatedate77VT_DATEVT_DATE

OUIOUIOUIOUIOUIOUIOUIOUIOLE Automation (Basic) stringOLE Automation (Basic) string88VT_BSTRVT_BSTR

OUIOUIOUIOUIOUIOUIOUIOUIIDispatchIDispatch **99VT_DISPATCHVT_DISPATCH

..........................................

OUIOUIOUIOUIOUIOUIOUIOUIcurrencycurrency66VT_CYVT_CY

OUIOUIOUIOUIOUIOUIOUIOUI8 byte real8 byte real55VT_R8VT_R8

OUIOUIOUIOUIOUIOUIOUIOUI4 byte real4 byte real44VT_R4VT_R4

OUIOUIOUIOUIOUIOUIOUIOUI4 byte4 byte signed intsigned int33VT_I4VT_I4

OUIOUIOUIOUIOUIOUIOUIOUI2 byte2 byte signed intsigned int22VT_I2VT_I2

NONNONOUIOUINONNONOUIOUISQL styleSQL style NullNull11VT_NULLVT_NULLNONNONOUIOUINONNONOUIOUInothingnothing00VT_EMPTYVT_EMPTY

dansdans

SafeArraySafeArraycommecomme

OLE OLE propertypropertydansdans

TYPEDESCTYPEDESCdansdans

VARIANTVARIANTSignificationSignificationValValTypeType

Page 17: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Derrière une méthode Derrière une méthode COM/DCOM ...COM/DCOM ...

��Chaque argument est vu comme une structure VARIANT qui Chaque argument est vu comme une structure VARIANT qui posspossèède le type (de le type (enumenum) et la valeur (union)) et la valeur (union)

typedef struct tagVARIANT typedef struct tagVARIANT {{VARTYPE VARTYPE vtvt;;unsignedunsigned short wReserved1;short wReserved1;unsignedunsigned short wReserved2;short wReserved2;unsignedunsigned short wReserved3;short wReserved3;union {union {

BYTE BYTE bValbVal; ; // VT_UI1// VT_UI1short short iValiVal; ; // VT_I2// VT_I2long long lVallVal; ; // VT_I4// VT_I4float fltValfloat fltVal; ; // VT_R4// VT_R4double double dblValdblVal; ; // VT_R8// VT_R8VARIANT_BOOLVARIANT_BOOL bValbVal; ; // VT_BOOL// VT_BOOLSCODE SCODE scodescode; // VT_ERROR; // VT_ERRORCY CY cyValcyVal; // VT_CY; // VT_CYDATE date; // VT_DATEDATE date; // VT_DATEBSTR BSTR bstrValbstrVal; // VT_BSTR; // VT_BSTRDECIMAL* DECIMAL* pdecVal pdecVal // VT_BYREF|VT_DECIMAL// VT_BYREF|VT_DECIMALIUnknownIUnknown* * punkValpunkVal; // VT_UNKNOWN; // VT_UNKNOWNIDispatchIDispatch* * pdispValpdispVal; // VT_DISPATCH; // VT_DISPATCHSAFEARRAY* SAFEARRAY* parrayparray; // VT_ARRAY|*; // VT_ARRAY|*BYTE* BYTE* pbValpbVal; // VT_BYREF|VT_UI1; // VT_BYREF|VT_UI1short* short* piValpiVal; // VT_BYREF|VT_I2; // VT_BYREF|VT_I2long* long* plValplVal; // VT_BYREF|VT_I4; // VT_BYREF|VT_I4floatfloat* * pfltValpfltVal; // VT_BYREF|VT_R4; // VT_BYREF|VT_R4

double*double* pdblValpdblVal; ; // VT_BYREF|VT_R8// VT_BYREF|VT_R8VARIANT_BOOL*VARIANT_BOOL* pboolValpboolVal; // VT_BYREF|VT_BOOL; // VT_BYREF|VT_BOOLSCODE*SCODE* pscodepscode; ; // VT_BYREF|VT_ERROR// VT_BYREF|VT_ERRORCY*CY* pcyValpcyVal; ; // VT_BYREF|VT_CY// VT_BYREF|VT_CYDATE*DATE* pdatepdate; ; // VT_BYREF|VT_DATE// VT_BYREF|VT_DATEBSTR*BSTR* pbstrValpbstrVal; ; // VT_BYREF|VT_BSTR// VT_BYREF|VT_BSTRIUnknownIUnknown**** ppunkValppunkVal; ; // VT_BYREF|VT_UNKNOWN// VT_BYREF|VT_UNKNOWNIDispatchIDispatch**** ppdispValppdispVal; ; // VT_BYREF|VT_DISPATCH// VT_BYREF|VT_DISPATCHSAFEARRAY** SAFEARRAY** pparraypparray; // VT_ARRAY|*; // VT_ARRAY|*VARIANT* VARIANT* pvarValpvarVal; // VT_BYREF|VT_VARIANT; // VT_BYREF|VT_VARIANTvoidvoid* * byrefbyref; ; // // Generic ByRefGeneric ByRef..char char cValcVal; // VT_I1; // VT_I1unsignedunsigned short short uiValuiVal; // VT_UI2; // VT_UI2unsignedunsigned long long ulValulVal; // VT_UI4; // VT_UI4int intValint intVal; // VT_INT; // VT_INTunsigned int uintValunsigned int uintVal; // VT_UINT; // VT_UINTchar* char* pcValpcVal; // VT_BYREF|VT_I1; // VT_BYREF|VT_I1unsignedunsigned short* short* puiValpuiVal; // VT_BYREF|VT_UI2; // VT_BYREF|VT_UI2unsignedunsigned long* long* pulValpulVal; // VT_BYREF|VT_UI4; // VT_BYREF|VT_UI4intint* * pintValpintVal; // VT_BYREF|VT_INT; // VT_BYREF|VT_INTunsigned intunsigned int* * puintValpuintVal; // VT_BYREF|VT_UINT; // VT_BYREF|VT_UINT};};

} VARIANT;} VARIANT;

Page 18: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Support C++/ATL pour Support C++/ATL pour COM/DCOMCOM/DCOM

��Classes C++ pour l'accClasses C++ pour l'accèès aux ms aux mééthodes, aux paramthodes, aux paramèètres et aux tres et aux attributs des interfaces COM/DCOM.attributs des interfaces COM/DCOM.

�� Inclure le fichier d'entInclure le fichier d'entêête te <<comdefcomdef.h>.h> avant utilisation !avant utilisation !

��La classe La classe _variant_t_variant_t posspossèèdes des constructeurs des des constructeurs àà partir de partir de pratiquement tous les types de VARIANT ainsi que des pratiquement tous les types de VARIANT ainsi que des extracteurs (opextracteurs (opéérateurs de rateurs de typecasttypecast surchargsurchargéés) vers ces typess) vers ces types

��La classe La classe __bstrbstr_t_t encapsuleencapsule le type le type BSTRBSTR et posset possèèdes des des des constructeurs constructeurs àà partir des partir des chaines chaines C/C++ de type ASCII C/C++ de type ASCII permettant une conversion permettant une conversion àà la volla voléée de e de constconst char*char* vers vers BSTRBSTR

��La classe La classe __comcom__ptrptr_t_t est un "smart pointer" car elleest un "smart pointer" car elle encapsuleencapsuleun pointeur vers une interface COM/DCOM, en assurant la un pointeur vers une interface COM/DCOM, en assurant la gestion intelligente de sa crgestion intelligente de sa crééation et de sa destructionation et de sa destruction

Page 19: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Création / utilisation directe Création / utilisation directe d'objets COM/DCOMd'objets COM/DCOM

�� Exemple d'utilisation en C/C++ sans MFC ou ATLExemple d'utilisation en C/C++ sans MFC ou ATL

–– Exploration des liens avec l'objet COM/DCOM Exploration des liens avec l'objet COM/DCOM ShellLinkShellLinkqui a le qui a le CLSID_CLSID_ShellLinkShellLink = {00021400= {00021400--00000000--00000000--C000C000--000000000046}000000000046}

–– L'objet expose plusieurs interfaces :L'objet expose plusieurs interfaces :IShellLinkIShellLink == {000214EE{000214EE--00000000--00000000--C000C000--000000000046}000000000046},,IPersistFileIPersistFile, , IUnknown IUnknown et d'autres et d'autres

–– EntêteEntête shlobjshlobj.h.h,, shlguidshlguid.h.h ... pour les CLSID, IID ... ... pour les CLSID, IID ... –– Bibliothèque Bibliothèque shell32.shell32.dlldll : point d'entrée : point d'entrée

DLLGetClassObjectDLLGetClassObject�� Ecrire une application Win32 console qui affiche toutes les Ecrire une application Win32 console qui affiche toutes les

informations concernant un lien (chemin, ligne de commande, informations concernant un lien (chemin, ligne de commande, paramètres, icône ...)paramètres, icône ...)

�� Faire la même chose pour tout un répertoire (*.Faire la même chose pour tout un répertoire (*.lnklnk))

Page 20: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Création / utilisation directe Création / utilisation directe d'objets COM/DCOMd'objets COM/DCOM

Version initialeVersion initiale�� Initialiser la couche COM/DCOMInitialiser la couche COM/DCOM�� Créer un objet Créer un objet ShellLinkShellLink avec une interface avec une interface IShellLinkIShellLink�� Obtenir / ouvrir une interface Obtenir / ouvrir une interface IPersistFileIPersistFile�� Charger le contenu du fichier de lien Charger le contenu du fichier de lien *.*.lnklnk�� Interroger l'interface Interroger l'interface IShellLinkIShellLink pour afficher les infospour afficher les infos�� Fermer correctement les interfaces et COM/DCOMFermer correctement les interfaces et COM/DCOMVersion amélioréeVersion améliorée�� Modifier l'application pour balayer un répertoire à Modifier l'application pour balayer un répertoire à

l'aide de l'aide de FindFirstFileFindFirstFile, , FindNextFileFindNextFile et et FindCloseFindClose

Page 21: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

AutomationAutomation

�� Caractéristiques principales :Caractéristiques principales :–– Rôle : exposer les fonctionnalités d'une application aux Rôle : exposer les fonctionnalités d'une application aux

autres applications, même les scriptsautres applications, même les scripts–– Hérite des normes DDE puis OLE et actuellement fait partie Hérite des normes DDE puis OLE et actuellement fait partie

intégrante de COM/DCOMintégrante de COM/DCOM–– Indépendante des autres caractéristiques OLE comme Indépendante des autres caractéristiques OLE comme

l'activation sur place, intégration, affichage etc.l'activation sur place, intégration, affichage etc.–– Appels souples (pour scripts) : par interfaces COM Appels souples (pour scripts) : par interfaces COM

absolument nécessaires : absolument nécessaires : IUnknownIUnknown et et IDispatchIDispatch–– Appels pré connus (pour C/C++): VTBL Appels pré connus (pour C/C++): VTBL binding binding si l'on si l'on

dispose des librairies de type (OLB, TLB etc.)dispose des librairies de type (OLB, TLB etc.)–– Deux types d'exécution par automation :Deux types d'exécution par automation :

�� InIn--process serverprocess server : exécution des DLL: exécution des DLL�� OutOut--ofof--process serverprocess server : exécution des EXE: exécution des EXE

Page 22: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Automation :Automation :application application remoteremote Word2K3Word2K3

�� Réaliser une application Win32 Console qui va Réaliser une application Win32 Console qui va commander WinWord par automation pour créer, commander WinWord par automation pour créer, sauvegarder et imprimer un fichier sauvegarder et imprimer un fichier infos.docinfos.doc avec avec des informations système.des informations système.

�� Format du futur fichier Format du futur fichier infos.docinfos.doc ::–– Titre (1er paragraphe) : Informations systèmeTitre (1er paragraphe) : Informations système

(Times New Roman 24pts, centré)(Times New Roman 24pts, centré)–– Tableau à 2 colonnes, 1ère colonne contient :Tableau à 2 colonnes, 1ère colonne contient :

�� Nom ordinateur, Nom utilisateur, Version système, Service pack, Nom ordinateur, Nom utilisateur, Version système, Service pack, Répertoire système, Taille écranRépertoire système, Taille écran

�� Utiliser les API Utiliser les API GetComputerNameGetComputerName, , GetSystemDirectoryGetSystemDirectory, , GetSystemMetricsGetSystemMetrics, , GetVersionExGetVersionEx, , GetSystemInfoGetSystemInfo etc. etc.

Page 23: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Automation sous C++/ATL:Automation sous C++/ATL:application application remoteremote Word2K3Word2K3

�� Créez une application Console Win32Créez une application Console Win32

�� Investiguer à l'aide de l'outil OLE/COM Investiguer à l'aide de l'outil OLE/COM ObjectViewer ObjectViewer l'interface d'automation Word2K3 ainsi que ses l'interface d'automation Word2K3 ainsi que ses éventuelles dépendanceséventuelles dépendances

�� Utiliser Utiliser VBAWD10.CHMVBAWD10.CHM comme fichier d'aidecomme fichier d'aide

�� Utiliser la directive Utiliser la directive #import#import pour traduire les pour traduire les interfaces d'automation Word2K3 en classes C++ (de interfaces d'automation Word2K3 en classes C++ (de type smart pointers) : type smart pointers) : msword9.msword9.olbolb

�� Inspecter les fichiers Inspecter les fichiers *.*.tlhtlh et et *.*.tlitli produits par le produits par le compilateur. Quelles classes, quelles méthodes ?compilateur. Quelles classes, quelles méthodes ?

�� Rajouter le nécessaire pour la compilation :Rajouter le nécessaire pour la compilation :–– vbe6ext.vbe6ext.olbolb,, msomso..dlldll,, stdole2.stdole2.tlbtlb: attention aux : attention aux namespacenamespacess !!

Page 24: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Automation Word2K3Automation Word2K3

�� Initialiser la couche COM/DCOM (Initialiser la couche COM/DCOM (CoInitializeCoInitialize ...)...)

�� De qui héritent toutes les classes d’interface ?De qui héritent toutes les classes d’interface ?

�� Déclarer/construire un objet Déclarer/construire un objet appapp de type de type __ApplicationPtrApplicationPtr en passant en passant ""Word.ApplicationWord.Application""

comme paramètre :comme paramètre :__ApplicationPtr appApplicationPtr app("("Word.ApplicationWord.Application");");appapp-->Visible = VARIANT_TRUE;>Visible = VARIANT_TRUE;SleepSleep(1000);(1000);appapp-->>QuitQuit();();

�� Inspecter les méthodes propres de l'objet Inspecter les méthodes propres de l'objet appapp et et les méthodes COM/DCOM surchargées.les méthodes COM/DCOM surchargées.

�� Comment obtenir l'accès aux autres interfaces ?Comment obtenir l'accès aux autres interfaces ?

Page 25: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Automation Word2K3Automation Word2K3

�� Inspecter et utiliser les interfaces suivantes :Inspecter et utiliser les interfaces suivantes :–– _Document_Document, , ParagraphParagraph, , RangeRange, , TableTable, etc., etc.

�� Utiliser le fichier d'aide Utiliser le fichier d'aide VbaWD10.CHMVbaWD10.CHM pour plus pour plus d'informations.d'informations.

�� Créer des fonctions supplémentaires si cela vous Créer des fonctions supplémentaires si cela vous semble nécessaire : par exemple pour rajouter du semble nécessaire : par exemple pour rajouter du texte dans la case d'un tableau etc.texte dans la case d'un tableau etc.

�� Comment sauvegarder le fichier (en évitant une Comment sauvegarder le fichier (en évitant une question sur l'existence d'un fichier avec le même question sur l'existence d'un fichier avec le même nom ...) ?nom ...) ?

�� Comment sauvegarder le fichier en format HTML Comment sauvegarder le fichier en format HTML ((infos.infos.htmhtm) ?) ?

Page 26: Programmation système et COM/DCOM sous Windowsmagestik.free.fr/Cours/Quatrieme.Annee/S8/GI2/Script/prog_av.pdf · COM/DCOM Bref rappel historique – DDE (Dynamic data exchange)

Automation Excel2K3Automation Excel2K3

�� Réaliser une autre application (ou juste une Réaliser une autre application (ou juste une nouvelle fonction) qui produit un résultat similaire nouvelle fonction) qui produit un résultat similaire en utilisant Excel2003en utilisant Excel2003

�� Utiliser OLE/COM Utiliser OLE/COM ObjectViewer ObjectViewer pour savoir quelles pour savoir quelles bibliothèques importerbibliothèques importer

�� Rechercher dans les répertoires d'installation Rechercher dans les répertoires d'installation d'Office 2003 le fichier d'aide nécessaired'Office 2003 le fichier d'aide nécessaire

�� Créer des fonctions supplémentaires si cela vous Créer des fonctions supplémentaires si cela vous semble nécessaire : par exemple pour rajouter du semble nécessaire : par exemple pour rajouter du texte dans la case d'une feuille Excel.texte dans la case d'une feuille Excel.

�� Mêmes questions (que sous Word 2003) sur la Mêmes questions (que sous Word 2003) sur la sauvegarde du fichier ...sauvegarde du fichier ...