PHP pode ser usado para acessar objetos COM e DCOM em plataformas Win32.
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.
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.
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.
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.
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, ..).
Não, infelizmente não existe tal ferramenta disponível para o PHP.
7. 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
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.allow_dcom para =TRUE no seu arquivo php.ini.
Edite seu arquivo php.ini e edite com.allow_dcom para =TRUE.
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 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 |
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.
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.
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 ?
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) :)
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.
15. 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.