<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'faq.com.php',
    1 => 'PHP et COM',
    2 => 'PHP et COM',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'FAQ',
  ),
  'prev' => 
  array (
    0 => 'faq.html.php',
    1 => 'PHP et HTML',
  ),
  'next' => 
  array (
    0 => 'faq.misc.php',
    1 => 'Questions diverses',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'faq/com.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.com" class="chapter">
  <h1 class="title">PHP et COM</h1>

  

   <p class="para">
    PHP peut être utilisé pour accéder à des objets COM et DCOM sur les
    plates-formes Win32.
   </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.com.q1">
     
      J&#039;ai compil&eacute; une DLL pour calculer quelque chose. Y a-t-il un moyen
      d&#039;utiliser cette DLL sous PHP ?
     
    </a></li><li><a href="#faq.com.q2">
     
      Que signifie &#039;Unsupported variant type: xxxx (0xxxxx)&#039; ?
     
    </a></li><li><a href="#faq.com.q3">
     
      Est-il possible de manipuler des objets visuels en PHP ?
     
    </a></li><li><a href="#faq.com.q4">
     
      Puis-je stocker un objet COM dans une session ?
     
    </a></li><li><a href="#faq.com.q5">
     
      Comment puis-je intercepter des erreurs COM ?
     
    </a></li><li><a href="#faq.com.q6">
     
      Puis-je g&eacute;n&eacute;rer des fichiers DLL &agrave; partir de PHP comme je le fais avec
      Perl ?
     
    </a></li><li><a href="#faq.com.q7">
     
      Que signifie &#039;Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&#039; ?
     
    </a></li><li><a href="#faq.com.q8">
     
      Comment puis-je utiliser des objets COM &agrave; partir d&#039;un serveur distant ?
     
    </a></li><li><a href="#faq.com.q9">
     
      J&#039;obtiens &#039;DCOM is disabled in C:\path...\scriptname.php on line 6&#039;, que
      dois-je faire ?
     
    </a></li><li><a href="#faq.com.q10">
     
      Est-il possible de charger/manipuler des objets ActiveX dans une page en
      PHP ?
     
    </a></li><li><a href="#faq.com.q11">
     
      Est-il possible d&#039;obtenir une instance en cours d&#039;ex&eacute;cution d&#039;un composant ?
     
    </a></li><li><a href="#faq.com.q12">
     
      Y a-t-il moyen de manipuler un &eacute;v&eacute;nement envoy&eacute; par un objet COM ?
     
    </a></li><li><a href="#faq.com.q13">
     
      J&#039;ai des probl&egrave;mes quand j&#039;invoque une m&eacute;thode d&#039;un objet COM qui expose
      plus d&#039;une interface. Que puis-je faire ?
     
    </a></li><li><a href="#faq.com.q14">
     
      Bon, PHP fonctionne avec COM, mais qu&#039;en est-il de COM+ ?
     
    </a></li><li><a href="#faq.com.q15">
     
      Si PHP peut manipuler des objets COM, peut-on imaginer d&#039;utiliser
      MTS pour g&eacute;rer les ressources de composants, en conjonction avec PHP ?
     
    </a></li></ol></div>
   <dl class="qandaentry" id="faq.com.q1">
    <dt><strong>
     
      J&#039;ai compilé une DLL pour calculer quelque chose. Y a-t-il un moyen
      d&#039;utiliser cette DLL sous PHP ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Si c&#039;est une DLL simple, il n&#039;y a aucun moyen pour le moment de
      l&#039;utiliser avec PHP. Si la DLL contient un serveur COM, il sera possible de
      l&#039;utiliser si elle implémente l&#039;interface IDispatch.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q2">
    <dt><strong>
     
      Que signifie &#039;Unsupported variant type: xxxx (0xxxxx)&#039; ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Il y a des dizaines de types de VARIANT et de combinaisons entre eux.
      La plupart d&#039;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&#039;autres types non supportés sont trouvés, les reporter
      comme un bogue (si ce n&#039;est pas déjà fait) en fournissant le plus
      d&#039;informations possibles.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q3">
    <dt><strong>
     
      Est-il possible de manipuler des objets visuels en PHP ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Généralement, c&#039;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&#039;apparaîtront jamais sur le bureau du
      serveur.
      Pour utiliser PHP pour scripter des applications, par
      exemple avec PHP-GTK, il n&#039;y a aucune limitation à accéder et
      manipuler des objets visuels via COM.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q4">
    <dt><strong>
     
      Puis-je stocker un objet COM dans une session ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Non, c&#039;est impossible. Les instances COM sont traitées comme des
      ressources, ce qui signifie qu&#039;elles ne sont disponibles que dans un
      seul contexte de script.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q5">
    <dt><strong>
     
      Comment puis-je intercepter des erreurs COM ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      L&#039;extension COM lance des exceptions
      <code class="literal">com_exception</code>, qu&#039;il est possible d&#039;intercepter puis
      d&#039;inspecter le membre <code class="literal">code</code> pour déterminer que faire.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q6">
    <dt><strong>
     
      Puis-je générer des fichiers DLL à partir de PHP comme je le fais avec
      Perl ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Non, il n&#039;y a malheureusement pas d&#039;outil disponible pour le faire en
      PHP.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q7">
    <dt><strong>
     
      Que signifie &#039;Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&#039; ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Cette erreur peut avoir plusieurs causes :
      <ul class="itemizedlist">
       <li class="listitem">
         <span class="simpara">
         le CLSID est incorrect
         </span>
        </li>
       <li class="listitem">
         <span class="simpara">
         la DLL demandée est introuvable
         </span>
        </li>
       <li class="listitem">
         <span class="simpara">
         le composant demandé n&#039;implémente pas l&#039;interface IDispatch
         </span>
        </li>
       </ul>
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q8">
    <dt><strong>
     
      Comment puis-je utiliser des objets COM à partir d&#039;un serveur distant ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Exactement de la même manière qu&#039;avec des objets locaux. Il faut
      juste passer l&#039;adresse IP de la machine distante en deuxième paramètre
      du constructeur COM.
     </p>
     <p class="para">
      Il faut s&#039;assurer d&#039;avoir spécifié
      <a href="com.configuration.php#ini.com.allow-dcom" class="link">com.allow_dcom</a><code class="literal">=</code><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> dans le
      <var class="filename">php.ini</var>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q9">
    <dt><strong>
     
      J&#039;obtiens &#039;DCOM is disabled in C:\path...\scriptname.php on line 6&#039;, que
      dois-je faire ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Éditer le <var class="filename">php.ini</var> et mettre
      <a href="com.configuration.php#ini.com.allow-dcom" class="link">com.allow_dcom</a><code class="literal">=</code><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q10">
    <dt><strong>
     
      Est-il possible de charger/manipuler des objets ActiveX dans une page en
      PHP ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Cela n&#039;a rien à voir avec PHP. Les objets ActiveX sont chargés côté
      client s&#039;ils sont demandés par le document HTML. Il n&#039;y a aucune relation
      avec le script PHP et il n&#039;y a pas d&#039;interaction directe possible
      avec le serveur.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q11">
    <dt><strong>
     
      Est-il possible d&#039;obtenir une instance en cours d&#039;exécution d&#039;un composant ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      C&#039;est possible avec l&#039;aide de monikers. Pour obtenir des références
      multiples au même mot d&#039;instance, il est possible de créer cette instance de la
      façon suivante :
     </p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$word </span><span style="color: #007700">= new </span><span style="color: #0000BB">COM</span><span style="color: #007700">(</span><span style="color: #DD0000">"C:\docs\word.doc"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <p class="para">
      Cela créera une nouvelle instance s&#039;il n&#039;y en a aucune disponible ou
      retournera un gestionnaire vers l&#039;instance en cours d&#039;exécution, si elle est
      disponible.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q12">
    <dt><strong>
     
      Y a-t-il moyen de manipuler un événement envoyé par un objet COM ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Il est possible de définir un moniteur d&#039;événement (sink) et le lier en
      utilisant <span class="function"><a href="function.com-event-sink.php" class="function">com_event_sink()</a></span>. Il est possible d&#039;utiliser
      <span class="function"><a href="function.com-print-typeinfo.php" class="function">com_print_typeinfo()</a></span> pour que PHP génère un
      squelette pour la classe du moniteur d&#039;événement.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q13">
    <dt><strong>
     
      J&#039;ai des problèmes quand j&#039;invoque une méthode d&#039;un objet COM qui expose
      plus d&#039;une interface. Que puis-je faire ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      La réponse est aussi simple que non satisfaisante. Il n&#039;y a pas de solution
      connue à ce problème.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q14">
    <dt><strong>
     
      Bon, PHP fonctionne avec COM, mais qu&#039;en est-il de COM+ ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      COM+ étend COM avec un canevas pour gérer des composants via MTS et MSMQ
      mais il n&#039;y a rien de particulier que PHP doit supporter pour utiliser
      de tels composants.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q15">
    <dt><strong>
     
      Si PHP peut manipuler des objets COM, peut-on imaginer d&#039;utiliser
      MTS pour gérer les ressources de composants, en conjonction avec PHP ?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHP ne supporte pas encore les transactions. Ainsi, si une erreur se
      produit, aucun rollback n&#039;est initié. Lors de l&#039;utilisation de composants
      qui supportent les transactions, il faut implémenter le
      gestionnaire de transactions soi-même.
     </p>
    </dd>
   </dl>

  
 </div>
<?php manual_footer($setup); ?>