Forum und email

PHP e COM

PHP pode ser usado para acessar objetos COM e DCOM em plataformas Win32.

  1. Eu construi uma DLL para calcular algo. Existe uma maneira de executar essa DLL no PHP ?
  2. O que 'Unsupported variant type: xxxx (0xxxxx)' significa ?
  3. É possível manipular objetos visuais no PHP ?
  4. Posso guardar um objeto COM em uma sessão ?
  5. Como eu trato erros de COM ?
  6. Posso gerar arquivos DLL de scripts PHP como eu posso no Perl ?
  7. O que significa 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}' ?
  8. Como posso executar um objeto COM de um servidor remoto ?
  9. Eu vejo o erro 'DCOM is disabled in C:\path...\scriptname.php on line 6', o que posso fazer ?
  10. É possível carregar/manipular um objeto ActiveX em uma página com o PHP ?
  11. É possível pegar uma instância sendo executada de um componente ?
  12. Existe alguma maneria de lidar com um evento enviado pode um objeto COM ?
  13. Estou tendo problemas quando tento invocar um método de um objeto COM que expõe mais de uma interface. O que posso fazer ?
  14. Então PHP funciona com COM, e com COM+ ?
  15. Se o PHP pode manipular objetos COM, podemos imaginar usar MTS para administrar recursos de componentes, em conjunção com PHP ?
  16. Eu construi uma DLL para calcular algo. Existe uma maneira de executar essa DLL no PHP ?

    Se for uma DLL simples, ainda não tem como executá-la no PHP. Se a DLL contem um serviço COM você pode acessá-lo se ele implementar a interface IDispatch.

    O que 'Unsupported variant type: xxxx (0xxxxx)' significa ?

    Existem dezenas de tipos VARIANT e combinações dos mesmos. A maioria deles já são suportados mas alguns ainda tem 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 bug (se não tiverem sido relatados ainda) e passe o máximo de informação disponível.

    É possível manipular objetos visuais no PHP ?

    Geralmente é, mas como o PHP é principalmente usado como linguagem de script pra 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, ex.: em conjunto com PHP-GTK não há limitação no acesso e manipulação de objetos visuais através de COM.

    Posso guardar um objeto COM em uma sessão ?

    Não, não pode. Instâncias COM são tratadas como recursos (resources) e, portanto, só estão disponíveis no contexto de um script único.

    Como eu trato erros de COM ?

    No PHP 5, a extensão COM dispara exceções do tipo com_exception, que você pode pegar e então inspecionar o membro code para determinar o que fazer depois.

    No PHP 4 não é possível pegar erros de COM a não ser pelas maneiras providas pelo próprio PHP (@, track_errors, ..).

    Posso gerar arquivos DLL de scripts PHP como eu posso no Perl ?

    Não, infelizmente não existe tal ferramenta disponível para o PHP.

    O que significa 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}' ?

    Esse erro pode ter várias razões:

    • o CLSID está errado
    • a DLL requisitada não existe ou não pode ser lida
    • o componente requisitado não implementa a interface IDispatch

    Como posso executar um objeto COM de um servidor remoto ?

    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.

    Assegure-se que você editou COM para =TRUE no seu arquivo php.ini.

    Eu vejo o erro 'DCOM is disabled in C:\path...\scriptname.php on line 6', o que posso fazer ?

    Edite seu arquivo php.ini e edite COM para =TRUE.

    É possível carregar/manipular um objeto ActiveX em uma página com o PHP ?

    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 interação direta possível com o lado do servidor.

    É possível pegar uma instância sendo executada de um componente ?

    É possível com a ajuda de monikers. Se você quiser referências múltiplas para a mesma instância você pode criar uma instância como mostrado abaixo:

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

    Isso criará uma nova instância se nenhuma instância sendo executada estiver disponível e retornará um handle para a ela, se disponível.

    Existe alguma maneria de lidar com um evento enviado pode um objeto COM ?

    Você pode definir um interceptador de eventos usando com_event_sink(). Você pode usar com_print_typeinfo() para que o PHP gere um esqueleto para a classe interceptadora de eventos.

    Estou tendo problemas quando tento invocar um método de um objeto COM que expõe mais de uma interface. O que posso fazer ?

    A resposta é tão simples quanto insatisfatória. Eu não sei exatamente, mas acho que não há nada a fazer. Se alguém tem informação específica sobre isso, por favor » me avise (mande e-mails em inglês) :)

    Então PHP funciona com COM, e com COM+ ?

    COM+ é COM mais uma framework para manusear componentes através de MTS e MSMQ mas não há nada especial que o PHP tenha suporte ao uso de tais componentes.

    Se o PHP pode manipular objetos COM, podemos imaginar usar MTS para administrar recursos de componentes, em conjunção com PHP ?

    O PHP em si não lida com transações ainda. Por isso, se um erro ocorre, nenhum rollback é iniciado. Se você usar componentes que suportem transações você pode implementar a administração de transações por conta própria.