OLE
et les objets automates (Automation Objects)
Présentation de la technologie "OLE Automation" ou comment permettre à une application d'accéder à des objets d'une autre application, le tout en JScript.
Conçue afin de permettre à différents logiciels
de communiquer entre eux, la technologie OLE (Object Linking and
Embedding) repose sur l'architecture COM.
Basés sur ce modèle, on retrouve plusieurs "services"
dont celui qui nous intéresse aujourd'hui, "OLE Automation",
qui permet de définir des objets automates (Automation Objects).
La mise en oeuvre de cette technique est souvent liée à
l'utilisation d'un langage de script, comme VBScript par exemple
(mais il est également possible d'utiliser d'autres langages
comme JScript,
la version Microsoft de JavaScript).
Les "objets automates" (Automation
Objects)
Ouvrir un tableau Excel au sein d'un document Word relève
typiquement de la technologie 'OLE Automation' ou 'ActiveX Automation'.
Chaque application supportant ce service dispose de ses propres
modèles objets, ce qui ne facilite pas la tâche
du programmeur quand la documentation vient à manquer. Les
applications "Office" de Microsoft sont cependant bien
documentées (exemple : Excel
/ Visual Basic Applications).
Dans notre exemple, l'application cliente, "Excel", va
dialoguer avec un objet automate de "Word" afin de découvrir
dynamiquement les objets et méthodes disponibles sur cette
application. Afin de mettre en pratique ce type de relations entre
deux applications, nous allons utiliser JScript mais sachez que
d'autres méthodes existent, il suffit que l'outil utilisé
soit "compatible" avec "OLE Automation" pour
que cela fonctionne.
Les performances varient selon le type de binding
Le "binding" est la manière dont le langage de
script utilisé par l'application cliente (ou "Automation
controller"), va accéder aux objets disponibles
sur l'application "destination", aussi appelée
"Automation server".
Ces deux notions, "Automation controller" et "Automation
server" sont très parlantes. En effet, dans notre exemple,
"Word" met à disposition des méthodes, des
objets (on peut donc considérer que c'est un serveur), destinés
à être utilisés par "Excel", qui représente
l'application "contrôleur", celle qui va agir sur
l'objet "automate" de "Word".
Avant de pouvoir consulter les propriétes, les méthodes,
les événements du modèle objet de "l'automation
server", "l'automation controller" doit créer
une instance de la classe qu'il souhaite utiliser. Ici, Jscript
et VB ne fonctionnent pas de la même manière.
VB et VBScript sont les plus riches et permettent d'utiliser les
deux types de binding. Lorsque "l'automation controller"
tente d'accéder à des "ressources" de l'application
"server", VB doit vérifier si ces objets, méthodes,
fonctions, existent et si cette "demande" est correctement
formulée. C'est cela aussi que l'on nomme le "binding".
Pour résumer, (la version longue se trouve
ici), le "late binding" se déroule lors
de l'exécution du programme, il est le moins performant des
deux types. Il s'implémente de la façon suivante :
(code VB)
Dim excelApp As Object
Set excelApp = CreateObject("Excel.Application")
Visual Basic doit ici vérifier à chaque fois que
l'objet "excelApp" est utilisé si ses méthodes,
propriétes, sont employées correctement. Cela implique
des contrôles au niveau du système d'exploitation ainsi
qu'au niveau de l'application qui fournit l'objet en question. De
plus, VB ne connaissant pas le type d'objet auquel fait référence
"excelApp" avant l'exécution, il doit prévoir
une quantité de mémoire suffisante, donc surevaluée.
L'"early binding" est une solution plus performante,
qui intervient lors de la compilation plutôt qu'à l'exécution.
Ainsi, lors de l'exécution du code, VB n'a plus à
se soucier de l'exactitude des informations liées à
l'objet concerné. Cependant, tous les "automation server"
ne supportent pas ce type de binding. Il faut en effet que le "serveur"
possède une librairie référencant les objets,
méthodes et autres propriétés liés à
l'objet auquel veut accéder "l'automation controller".
Voici à quoi ressemble la mise en place de ce 'binding"
:
(code VB)
Dim excelApp As Excel.Application
Set excelApp = CreateObject("Excel.Application")
Nous ne pourrons hélas pas utiliser ce type de "binding"
en JScript. Deux raisons à cela :
- Le JScript est interprété, donc pas d'étape
de compilation avant l'exécution.
- Le JScript n'est pas typé, on ne peut pas déclarer
une variable comme un type d'objet spécifique.
Il nous faut alors se rabattre sur le "late binding".
Le "constructeur" ActiveXObject()
La fonction ActiveXObject() permet d'établir une
interface entre "l'automation controller" et "l'automation
server" :
(code JScript)
var excelApp = new ActiveXObject("Excel.Application");
"excelApp" permet de manipuler l'objet instancié.
La fonction, ActiveXObjet() prend en paramètre le nom d'une
application (ici "Excel") et le type de l'objet à
créer (Ici "Application"). Un paramètre
facultatif permet de définir un serveur, mais nous n'en parlerons
pas ici.
A ne pas oublier, la libération de la mémoire en
fin de traitement :
var excelApp = new ActiveXObject("Excel.Application");
excelApp.Quit(); // Libère la mémoire.
Passons maintenant à un petit exercice relatif à
"Word" :
Copiez le code suivant dans un fichier "version_word.htm"
par exemple, et si vous disposez de cette application, le numéro
de version de celle-ci apparaîtra dans un message d'alerte
à condition que vous activiez ou acceptiez temporairement
(!) le déroulement d'un contrôle ActiveX sur votre
poste (les réglages sont à effectuer dans le menu
"outils -> options internet -> sécurité"
de votre Internet Explorer (v4 et plus)). La fonction JScript employée
est la suivante :
(Pour Internet Explorer)
<script language="JScript">
function getVersion()
{
var
wordApp = new ActiveXObject("Word.Application");
alert(wordApp.Version);
}
</script>
Une fois notre instance créée, nous pouvons la manipuler
via la variable locale définie et accéder alors aux
propriétés de l'objet.
Enfin, sachez que le nombre d'instances (d'une application) réellement
créées n'est pas forcément équivalent
au nombre de fois où le constructeur ActiveXObject()
a été appelé. En effet, pour résumer,
il existe deux sortes d'applications, les SDI (Single Document
Interface), par exemple "Homesite", et les MDI
(Multiple Document Interface), par exemple "Word". Le
nombre d'instances / documents utilisables à la fois pour
une même application dépend de ces deux types.
Autre fonction importante disponible en JScript : GetObject().
Elle permet d'accèder à un objet automate situé
dans un fichier. Nous ne traiterons pas en détail cette fonction
ici, pour plus d'informations, vous pouvez consulter la rubrique
adéquate sur MSDN.
Ainsi s'achève cet aperçu de la technologie OLE /
ActiveX, appliquée à JScript. Sachez pour finir qu'il
est déconseillé d'exécuter un contrôle
ActiveX dont vous ignorez la provenance. Si vous avez des doutes,
passez votre chemin, il est en effet possible de subir de graves
préjudices à la suite de l'exécution sur votre
poste d'un script mal intentionné.
[Arnaud
Gadal 16
octobre 2001 , JDNet]
|