Files
archived-doc-pt-br/faq/com.xml
2025-09-01 12:12:50 -03:00

286 lines
8.4 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: e0352653179c355a6b9c353629147b06a2069f24 Maintainer: ae Status: ready --><!-- CREDITS: narigone,marcelsud,ae,leonardolara -->
<chapter xml:id="faq.com" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>PHP e COM</title>
<titleabbrev>PHP e COM</titleabbrev>
<para>
PHP pode ser usado para acessar objetos COM e DCOM em plataformas Win32.
</para>
<qandaset>
<qandaentry xml:id="faq.com.q1">
<question>
<para>
Eu construí uma DLL para calcular algo. Existe uma maneira de executar essa DLL no PHP?
</para>
</question>
<answer>
<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.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q2">
<question>
<para>
O que 'Unsupported variant type: xxxx (0xxxxx)' significa?
</para>
</question>
<answer>
<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.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q3">
<question>
<para>
É possível manipular objetos visuais no PHP?
</para>
</question>
<answer>
<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.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q4">
<question>
<para>
Posso guardar um objeto COM em uma sessão?
</para>
</question>
<answer>
<para>
Não, não pode. Instâncias COM são tratadas como recursos (tipo "resource") e, portanto, só estão disponíveis no contexto de um script único.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q5">
<question>
<para>
Como eu capturo erros de COM?
</para>
</question>
<answer>
<para>
A extensão COM lança exceções do tipo
<literal>com_exception</literal>, que você pode capturar e então inspecionar o
membro <literal>code</literal> para determinar o que fazer em seguida.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q6">
<question>
<para>
Posso gerar arquivos DLL a partir de scripts PHP como eu posso no Perl?
</para>
</question>
<answer>
<para>
Não, infelizmente não existe tal ferramenta disponível para o PHP.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q7">
<question>
<para>
O que significa 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
</para>
</question>
<answer>
<para>
Esse erro pode ter várias razões:
<itemizedlist>
<listitem>
<simpara>
o CLSID está errado
</simpara>
</listitem>
<listitem>
<simpara>
a DLL requisitada não existe ou não pode ser lida
</simpara>
</listitem>
<listitem>
<simpara>
o componente requisitado não implementa a interface IDispatch
</simpara>
</listitem>
</itemizedlist>
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q8">
<question>
<para>
Como posso executar um objeto COM a partir de um servidor remoto?
</para>
</question>
<answer>
<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.
</para>
<para>
Tenha certeza de marcar
<link linkend="ini.com.allow-dcom">com.allow_dcom</link><literal>=</literal>&true;
no seu &php.ini;.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q9">
<question>
<para>
Eu vejo o erro 'DCOM is disabled in C:\path...\scriptname.php on line 6', o que posso fazer?
</para>
</question>
<answer>
<para>
Edite seu arquivo &php.ini; e marque
<link linkend="ini.com.allow-dcom">com.allow_dcom</link><literal>=</literal>&true;.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q10">
<question>
<para>
É possível carregar/manipular um objeto ActiveX em uma página com PHP?
</para>
</question>
<answer>
<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.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q11">
<question>
<para>
É possível obter uma instância em execução de um componente?
</para>
</question>
<answer>
<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:
</para>
<programlisting role="php">
<![CDATA[
<?php
$word = new COM("C:\docs\word.doc");
?>
]]>
</programlisting>
<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.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q12">
<question>
<para>
Existe alguma maneira de lidar com um evento enviado por um objeto COM?
</para>
</question>
<answer>
<para>
Você pode definir um interceptador de eventos e vinculá-lo usando
<function>com_event_sink</function>. Você pode usar
<function>com_print_typeinfo</function> para que o PHP gere um esqueleto
para a classe interceptadora de eventos.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q13">
<question>
<para>
Estou tendo problemas ao tentar invocar um método de um objeto COM
que expõe mais de uma interface. O que posso fazer?
</para>
</question>
<answer>
<para>
A resposta é tão simples quanto insatisfatória. Não sabemos exatamente, mas achamos que não há nada que você possa fazer.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q14">
<question>
<para>
Então PHP funciona com COM. E com COM+?
</para>
</question>
<answer>
<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.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q15">
<question>
<para>
Se o PHP pode manipular objetos COM, podemos imaginar o uso de
MTS para manipular recursos de componentes, em conjunto com o PHP?
</para>
</question>
<answer>
<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.
</para>
</answer>
</qandaentry>
</qandaset>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->