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 fonctionnelle 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 des 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, vous pourrez 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 elles. La plupart d'entre elles sont d�j� support�es, mais quelques une ne sont toujours pas impl�ment�es. Les tableaux ne sont pas compl�tement support�s. Seuls le tableaux unidimensionnels index�s peuvent �tre transmis entre PHP et COM. Si vous trouvez d'autres types qui ne sont pas support�s, reportez-les nous comme un bogue (si ce n'est pas d�j� fait) et fournissez 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. Si vous voulez 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, vous ne pouvez pas. 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 ?

En PHP 5, l'extension COM envoie des exceptions com_exception, que vous pouvez intercepter en inspectant le membre code pour d�terminer que faire.

En PHP 4, il n'est pas possible d'intercepter des erreurs COM en dehors de la fa�on dont elles sont fournies par PHP lui-m�me (@, track_errors, ..).

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. Vous devez juste passer l'adresse IP de la machine distante en deuxi�me param�tre du constructeur COM.

Assurez-vous que vous avez sp�cifi� com.allow_dcom=TRUE dans votre php.ini.

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

�ditez votre php.ini et mettez 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'il 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 fonctionnelle d'un composant ?

C'est possible avec l'aide de monikers. Si vous voulez des r�f�rences multiples au m�me mot d'instance, vous pouvez cr�er une 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 descripteur vers l'instance courante, si elle est disponible.

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

Vous pouvez d�finir un moniteur d'�v�nement (sink) et le lier en utilisant com_event_sink(). Vous pouvez 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. Je ne sais pas exactement, mais je pense que vous ne pouvez rien faire. Si quelqu'un a des informations sp�cifiques sur ce sujet, faites-le » moi savoir :)

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 des 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�. Si vous utilisez des composants qui supportent les transactions, vous devrez impl�menter le gestionnaire de transactions par vous-m�me.