# PHP et COM

PHP peut être utilisé pour accéder à des objets COM et DCOM sur les plates-formes Win32.

1. J'ai compilé une DLL pour calculer quelque chose. Y a-t-il un moyen d'utiliser cette DLL sous PHP ?
2. Que signifie 'Unsupported variant type: xxxx (0xxxxx)' ?
3. Est-il possible de manipuler des objets visuels en PHP ?
4. Puis-je stocker un objet COM dans une session ?
5. Comment puis-je intercepter des erreurs COM ?
6. Puis-je générer des fichiers DLL à partir de PHP comme je le fais avec Perl ?
7. Que signifie 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}' ?
8. Comment puis-je utiliser des objets COM à partir d'un serveur distant ?
9. J'obtiens 'DCOM is disabled in C:\path...\scriptname.php on line 6', que dois-je faire ?
10. Est-il possible de charger/manipuler des objets ActiveX dans une page en PHP ?
11. Est-il possible d'obtenir une instance en cours d'exécution d'un composant ?
12. Y a-t-il moyen de manipuler un événement envoyé par un objet COM ?
13. J'ai des problèmes quand j'invoque une méthode d'un objet COM qui expose plus d'une interface. Que puis-je faire ?
14. Bon, PHP fonctionne avec COM, mais qu'en est-il de COM+ ?
15. Si PHP peut manipuler des objets COM, peut-on imaginer d'utiliser MTS pour gérer les ressources de composants, en conjonction avec PHP ?

J'ai compilé une DLL pour calculer quelque chose. Y a-t-il un moyen d'utiliser cette DLL sous PHP ?

  Si c'est une DLL simple, il n'y a aucun moyen pour le moment de l'utiliser avec PHP. Si la DLL contient un serveur COM, il sera possible de l'utiliser si elle implémente l'interface IDispatch.

Que signifie 'Unsupported variant type: xxxx (0xxxxx)' ?

  Il y a des dizaines de types de VARIANT et de combinaisons entre eux. La plupart d'entre elles sont déjà supportées, mais quelques-unes ne sont toujours pas implémentées. Les tableaux ne sont pas complètement supportés. Seuls les tableaux unidimensionnels indexés peuvent être transmis entre PHP et COM. Si d'autres types non supportés sont trouvés, les reporter comme un bogue (si ce n'est pas déjà fait) en fournissant le plus d'informations possibles.

Est-il possible de manipuler des objets visuels en PHP ?

  Généralement, c'est possible, mais comme PHP est utilisé le plus souvent en tant que langage de script web et dans un environnement de serveur web, les objets visuels n'apparaîtront jamais sur le bureau du serveur. Pour utiliser PHP pour scripter des applications, par exemple avec PHP-GTK, il n'y a aucune limitation à accéder et manipuler des objets visuels via COM.

Puis-je stocker un objet COM dans une session ?

  Non, c'est impossible. Les instances COM sont traitées comme des ressources, ce qui signifie qu'elles ne sont disponibles que dans un seul contexte de script.

Comment puis-je intercepter des erreurs COM ?

  L'extension COM lance des exceptions `com_exception`, qu'il est possible d'intercepter puis d'inspecter le membre `code` pour déterminer que faire.

Puis-je générer des fichiers DLL à partir de PHP comme je le fais avec Perl ?

  Non, il n'y a malheureusement pas d'outil disponible pour le faire en PHP.

Que signifie 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}' ?

  Cette erreur peut avoir plusieurs causes :

  - le CLSID est incorrect
  - la DLL demandée est introuvable
  - le composant demandé n'implémente pas l'interface IDispatch

Comment puis-je utiliser des objets COM à partir d'un serveur distant ?

  Exactement de la même manière qu'avec des objets locaux. Il faut juste passer l'adresse IP de la machine distante en deuxième paramètre du constructeur COM.

  Il faut s'assurer d'avoir spécifié com.allow_dcom`=``true` dans le php.ini.

J'obtiens 'DCOM is disabled in C:\path...\scriptname.php on line 6', que dois-je faire ?

  Éditer le php.ini et mettre com.allow_dcom`=``true`.

Est-il possible de charger/manipuler des objets ActiveX dans une page en PHP ?

  Cela n'a rien à voir avec PHP. Les objets ActiveX sont chargés côté client s'ils sont demandés par le document HTML. Il n'y a aucune relation avec le script PHP et il n'y a pas d'interaction directe possible avec le serveur.

Est-il possible d'obtenir une instance en cours d'exécution d'un composant ?

  C'est possible avec l'aide de monikers. Pour obtenir des références multiples au même mot d'instance, il est possible de créer cette instance de la façon suivante :

      <?php
      $word = new COM("C:\docs\word.doc");
      ?>

  Cela créera une nouvelle instance s'il n'y en a aucune disponible ou retournera un gestionnaire vers l'instance en cours d'exécution, si elle est disponible.

Y a-t-il moyen de manipuler un événement envoyé par un objet COM ?

  Il est possible de définir un moniteur d'événement (sink) et le lier en utilisant com_event_sink(). Il est possible d'utiliser com_print_typeinfo() pour que PHP génère un squelette pour la classe du moniteur d'événement.

J'ai des problèmes quand j'invoque une méthode d'un objet COM qui expose plus d'une interface. Que puis-je faire ?

  La réponse est aussi simple que non satisfaisante. Il n'y a pas de solution connue à ce problème.

Bon, PHP fonctionne avec COM, mais qu'en est-il de COM+ ?

  COM+ étend COM avec un canevas pour gérer des composants via MTS et MSMQ mais il n'y a rien de particulier que PHP doit supporter pour utiliser de tels composants.

Si PHP peut manipuler des objets COM, peut-on imaginer d'utiliser MTS pour gérer les ressources de composants, en conjonction avec PHP ?

  PHP ne supporte pas encore les transactions. Ainsi, si une erreur se produit, aucun rollback n'est initié. Lors de l'utilisation de composants qui supportent les transactions, il faut implémenter le gestionnaire de transactions soi-même.

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open