<?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 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'faq.com.php',
    1 => 'PHP e COM',
    2 => 'PHP e COM',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'FAQ',
  ),
  'prev' => 
  array (
    0 => 'faq.html.php',
    1 => 'PHP e HTML',
  ),
  'next' => 
  array (
    0 => 'faq.misc.php',
    1 => 'Quest&otilde;es Diversas',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    '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 e COM</h1>

  

   <p class="para">
    PHP pode ser usado para acessar objetos COM e DCOM em plataformas Win32.
   </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.com.q1">
     
      Eu constru&iacute; uma DLL para calcular algo. Existe uma maneira de executar essa DLL no PHP?
     
    </a></li><li><a href="#faq.com.q2">
     
      O que &#039;Unsupported variant type: xxxx (0xxxxx)&#039; significa?
     
    </a></li><li><a href="#faq.com.q3">
     
      &Eacute; poss&iacute;vel manipular objetos visuais no PHP?
     
    </a></li><li><a href="#faq.com.q4">
     
      Posso guardar um objeto COM em uma sess&atilde;o?
     
    </a></li><li><a href="#faq.com.q5">
     
      Como eu capturo erros de COM?
     
    </a></li><li><a href="#faq.com.q6">
     
      Posso gerar arquivos DLL a partir de scripts PHP como eu posso no Perl?
     
    </a></li><li><a href="#faq.com.q7">
     
      O que significa &#039;Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&#039;?
     
    </a></li><li><a href="#faq.com.q8">
     
      Como posso executar um objeto COM a partir de um servidor remoto?
     
    </a></li><li><a href="#faq.com.q9">
     
      Eu vejo o erro &#039;DCOM is disabled in C:\path...\scriptname.php on line 6&#039;, o que posso fazer?
     
    </a></li><li><a href="#faq.com.q10">
     
      &Eacute; poss&iacute;vel carregar/manipular um objeto ActiveX em uma p&aacute;gina com PHP?
     
    </a></li><li><a href="#faq.com.q11">
     
      &Eacute; poss&iacute;vel obter uma inst&acirc;ncia em execu&ccedil;&atilde;o de um componente?
     
    </a></li><li><a href="#faq.com.q12">
     
      Existe alguma maneira de lidar com um evento enviado por um objeto COM?
     
    </a></li><li><a href="#faq.com.q13">
     
      Estou tendo problemas ao tentar invocar um m&eacute;todo de um objeto COM
      que exp&otilde;e mais de uma interface. O que posso fazer?
     
    </a></li><li><a href="#faq.com.q14">
     
      Ent&atilde;o PHP funciona com COM. E com COM+?
     
    </a></li><li><a href="#faq.com.q15">
     
      Se o PHP pode manipular objetos COM, podemos imaginar o uso de
      MTS para manipular recursos de componentes, em conjunto com o PHP?
     
    </a></li></ol></div>
   <dl class="qandaentry" id="faq.com.q1">
    <dt><strong>
     
      Eu construí uma DLL para calcular algo. Existe uma maneira de executar essa DLL no PHP?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Se for uma DLL simples, ainda não tem como executá-la no PHP. Se a DLL contiver um serviço
      COM, você pode acessá-lo se ele implementar a interface IDispatch.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q2">
    <dt><strong>
     
      O que &#039;Unsupported variant type: xxxx (0xxxxx)&#039; significa?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Existem dezenas de tipos VARIANT e combinações dos mesmos. A maioria deles já é suportada mas
      alguns ainda têm que ser implementados.
      Arrays não são completamente suportados. Apenas arrays indexados com
      uma única dimensão podem ser passados entre o PHP e COM.
      Se você achar outros tipos que não são suportados, por favor relate-os como um problema (se não tiverem sido relatados ainda)
      e passe o máximo de informação disponível.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q3">
    <dt><strong>
     
      É possível manipular objetos visuais no PHP?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Geralmente é, mas como o PHP é principalmente usado como linguagem de script para web, ele é executado no contexto dos servidores web, então
      objetos visuais nunca aparecerão no desktop do servidor.
      Se você usa o PHP para script de aplicações (por exemplo, em conjunto com PHP-GTK) não há limitação no acesso e
      manipulação de objetos visuais através de COM.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q4">
    <dt><strong>
     
      Posso guardar um objeto COM em uma sessão?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Não, não pode. Instâncias COM são tratadas como recursos (tipo &quot;resource&quot;) e, portanto, só estão disponíveis no contexto de um script único.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q5">
    <dt><strong>
     
      Como eu capturo erros de COM?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      A extensão COM lança exceções do tipo
      <code class="literal">com_exception</code>, que você pode capturar e então inspecionar o
      membro <code class="literal">code</code> para determinar o que fazer em seguida.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q6">
    <dt><strong>
     
      Posso gerar arquivos DLL a partir de scripts PHP como eu posso no Perl?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Não, infelizmente não existe tal ferramenta disponível para o PHP.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q7">
    <dt><strong>
     
      O que significa &#039;Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&#039;?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Esse erro pode ter várias razões:
      <ul class="itemizedlist">
       <li class="listitem">
         <span class="simpara">
         o CLSID está errado
         </span>
        </li>
       <li class="listitem">
         <span class="simpara">
         a DLL requisitada não existe ou não pode ser lida
         </span>
        </li>
       <li class="listitem">
         <span class="simpara">
         o componente requisitado não implementa a interface IDispatch
         </span>
        </li>
       </ul>
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q8">
    <dt><strong>
     
      Como posso executar um objeto COM a partir de um servidor remoto?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Exatamente como você executa objetos locais. Você só tem que passar o IP da máquina remota como segundo parâmetro para
      o construtor COM.
     </p>
     <p class="para">
      Tenha certeza de marcar
      <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>
      no seu <var class="filename">php.ini</var>.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q9">
    <dt><strong>
     
      Eu vejo o erro &#039;DCOM is disabled in C:\path...\scriptname.php on line 6&#039;, o que posso fazer?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Edite seu arquivo <var class="filename">php.ini</var> e marque
      <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>
     
      É possível carregar/manipular um objeto ActiveX em uma página com PHP?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Isso não tem nada a ver com o PHP. Objetos ActiveX são carregados no lado do cliente se eles forem requisitados
      pelo documento HTML. Não há relação com o script PHP e, portanto, nenhuma possível interação
      direta com o lado do servidor.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.com.q11">
    <dt><strong>
     
      É possível obter uma instância em execução de um componente?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      É possível com a ajuda de monikers. Se você quiser obter referências múltiplas para a mesma instância
      do Word, você pode criar essa instância como mostrado abaixo:
     </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">
      Isso criará uma nova instância se não houver nenhuma instância em execução disponível e retornará um identificador para a
      instância em execução, se disponível.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.com.q12">
    <dt><strong>
     
      Existe alguma maneira de lidar com um evento enviado por um objeto COM?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Você pode definir um interceptador de eventos e vinculá-lo usando
      <span class="function"><a href="function.com-event-sink.php" class="function">com_event_sink()</a></span>. Você pode usar
      <span class="function"><a href="function.com-print-typeinfo.php" class="function">com_print_typeinfo()</a></span> para que o PHP gere um esqueleto
      para a classe interceptadora de eventos.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q13">
    <dt><strong>
     
      Estou tendo problemas ao tentar invocar um método de um objeto COM
      que expõe mais de uma interface. O que posso fazer?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      A resposta é tão simples quanto insatisfatória. Não sabemos exatamente, mas achamos que não há nada que você possa fazer.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q14">
    <dt><strong>
     
      Então PHP funciona com COM. E com COM+?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      COM+ estende COM por meio de um framework para manipular componentes através de MTS e MSMQ, mas não há nada de especial
      que o PHP precise suportar para usar tais componentes.
     </p>
    </dd>
   </dl>

   <dl class="qandaentry" id="faq.com.q15">
    <dt><strong>
     
      Se o PHP pode manipular objetos COM, podemos imaginar o uso de
      MTS para manipular recursos de componentes, em conjunto com o PHP?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      O PHP em si não lida com transações ainda. Por isso, se um erro
      ocorrer, nenhuma reversão é iniciada. Se você usar componentes que
      suportam transações, você terá que implementar a
      manipulação de transações por conta própria.
     </p>
    </dd>
   </dl>

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