PHP и COM

PHP может быть использован для доступа к объектам COM и DCOM на платформах Win32.

  1. Я собрал DLL для кое-каких вычислений. Можно ли запустить эту DLL из PHP?
  2. Что значит 'Unsupported variant type: xxxx (0xxxxx)'?
  3. Возможно ли манипулирование визуальными объектами в PHP?
  4. Могу ли я сохранять объект COM в сессии?
  5. Как я могу поймать ошибки COM?
  6. Можно ли генерировать DLL-файлы из PHP-скриптов так, как это можно делать в Perl?
  7. Что значит 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
  8. Как можно запускать COM-объекты с удаленного сервера?
  9. Я получаю 'DCOM is disabled in C:\path...\scriptname.php on line 6', что делать?
  10. Возможно ли с помощью PHP загрузить/манипулировать объектом ActiveX на странице?
  11. Возможно ли получить выполняющийся экземпляр компонента?
  12. Есть ли способ обработать событие, посланное объектом COM?
  13. У меня возникают проблемы при попытке вызвать метод объекта COM, который предоставляет более чем один интерфейс. Что я могу сделать?
  14. Значит PHP работает с COM, как насчет COM+?
  15. Если PHP может манипулировать COM-объектами, можно ли представить себе использование MTS для управления ресурсами компонентов в соединении с PHP?
Я собрал DLL для кое-каких вычислений. Можно ли запустить эту DLL из PHP?

Если это простая DLL, то пока еще нет возможности вызвать её из PHP. Если DLL содержит COM-сервер, то вы можете получить доступ к ней, если она реализует интерфейс IDispatch.

Что значит 'Unsupported variant type: xxxx (0xxxxx)'?

Существуют дюжины типов VARIANT и их комбинаций. Большинство из них уже поддерживаются, но несколько все еще не реализованы. Массивы поддерживаются не полностью. Только одномерные индексированные массивы могут передаваться между PHP и COM. Если вы обнаружите неподдерживаемые типы, пожалуйста, сообщите о них как об ошибке (если это еще не сделано) и предоставьте всю доступную информацию.

Возможно ли манипулирование визуальными объектами в PHP?

В общем да, но так как PHP в основном используется как скриптовый язык для веба и выполняется в контексте веб-сервера, то визуальные объекты никогда не появятся на рабочем столе сервера. Если вы используете PHP как скрипт для приложений, например в связке с PHP-GTK, тогда нет ограничений на доступ и манипулирование визуальными объектами через COM.

Могу ли я сохранять объект COM в сессии?

Нет, не можете. Так как экземпляры COM рассматриваются как ресурсы, то они доступны только в контексте одного скрипта.

Как я могу поймать ошибки COM?

Расширение COM выбрасывает исключение com_exception, которое вы можете перехватить и затем проверить у него поле code, чтобы понять, что делать дальше.

Можно ли генерировать DLL-файлы из PHP-скриптов так, как это можно делать в Perl?

Нет, к сожалению такое средство недоступно для PHP.

Что значит 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?

Эта ошибка может возникнуть по разным причинам:

  • неправильный CLSID
  • отсутствует запрошенная DLL
  • запрошенный компонент не реализует интерфейс IDispatch

Как можно запускать COM-объекты с удаленного сервера?

Точно так же как вы запускаете локальные объекты. Вам только надо передать IP удаленной машины как второй параметр конструктора COM.

Убедитесь, что в вашем php.ini вы установили com.allow_dcom=true

Я получаю 'DCOM is disabled in C:\path...\scriptname.php on line 6', что делать?

Отредактируйте ваш php.ini и установите com.allow_dcom=true.

Возможно ли с помощью PHP загрузить/манипулировать объектом ActiveX на странице?

PHP здесь не причем. Объекты ActiveX загружаются на стороне клиента, если они были запрошены из HTML документа. Связи с PHP-скриптом здесь нет и, следовательно, прямое взаимодействие с серверной стороной невозможно.

Возможно ли получить выполняющийся экземпляр компонента?

Это возможно с помощью моникеров (monikers). Если вы хотите получить несколько ссылок на один и тот же экземпляр Word, вы можете создать этот экземпляр как показано:

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

Это создаст новый экземпляр, если нет доступного выполняющегося экземпляра или будет возвращена ссылка на выполняющийся экземпляр, если такой доступен.

Есть ли способ обработать событие, посланное объектом COM?

Используя com_event_sink() вы можете определить приемник события и привязать его. Вы можете заставить PHP сгенерировать скелет класса приемника событий, используя com_print_typeinfo().

У меня возникают проблемы при попытке вызвать метод объекта COM, который предоставляет более чем один интерфейс. Что я могу сделать?

Ответ так же прост, как и неудовлетворителен. Не знаю точно, но думаю, что вы не можете ничего сделать. Если у кого-то есть точная информация по этому вопросу, пожалуйста, дайте » мне знать :)

Значит PHP работает с COM, как насчет COM+?

COM+ расширяет COM, предоставляя систему для управления компонентами через MTS и MSMQ, но здесь нет ничего особенного, что PHP должен поддерживать для использования таких компонент.

Если PHP может манипулировать COM-объектами, можно ли представить себе использование MTS для управления ресурсами компонентов в соединении с PHP?

Сам PHP еще не обрабатывает транзакции. Таким образом, если возникает ошибка, откат не инициируется. Если вы используете компоненты, поддерживающие транзакции, вам будет необходимо реализовать управление транзакциями самим.