PHP. Руководство по PHP. 2005
PHP и COM Пред.
Глава 72. 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, то пока ещё нет возможности вызвать её из PHP.
Если DLL содержит COM сервер, то вы могли бы получить доступ к ней, если
она реализует интерфейс IDispatch.
Существуют дюжины VARIANT типов и их комбинаций. Большинство из них уже
поддерживается, но несколько всё ещё не реализованы.
Массивы поддерживаются не полностью. Только одномерные индексированные
массивы могут передаваться между PHP и COM. Если вы обнаружите неподдерживаемые
типы, пожалуйста, сообщите о них как об ошибке (если это ещё не сделано)
и предоставте всю доступную информацию.
В общем да, но так как PHP в основном используется как скриптовый язык для
web и выполняется в контексте web сервера, то визуальные объекты никогда
не появятся на рабочем столе (desktop) сервера. Если вы используете PHP как
скрипт для приложений, например в связке с PHP-GTK, тогда нет ограничений
на доступ и манипулирование визуальными объектами через COM.
Нет, не можете. Так как с экземплярами COM объектов обращаются
как с ресурсами, то они доступны только в контексте одного скрипта.
В PHP 5 COM расширение возбуждает исключение
com_exception, которое вы можете перехватить
и затем проверить поле code для того, чтобы
определить что делать дальше.
В PHP 4 поймать COM ошибки средствами, отличными от тех, что предлагает
сам PHP (@, track_errors,...) невозможно.
Нет, к сожалению такое средство недоступно для PHP.
Что значит
'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
Эта ошибка может возникнуть по разным причинам:
неправильный CLSID
отсутствует запрошенная DLL
запрошенный компонент не реализует интерфейс IDispatch
Точно так же как вы запускаете локальные объекты. Вам только надо передать
IP удалённой машины как второй параметер COM конструктора.
Убедитесь, что в вашем php.ini вы установили
- com.allow_dcom =TRUE .
PHP здесь не причём. ActiveX объекты загружаются на стороне клиента,
если они были запрошены из HTML документа. Связи с PHP скриптом нет и,
следовательно, прямое взаимодействие с серверной стороной невозможно.
Это возможно с помощью моникеров. Если вы хотите получить несколько
ссылок на один и тот же экземпляр Word, вы можете создать этот экземпляр
как показано:
|
Это создаст новый экземпляр, если нет доступного выполняющегося экземпляра
или будет возвращена ссылка на выполняющийся экземпляр, если таковой доступен.
Используя com_event_sink() вы можете определить
приёмник события и привязать его. Вы можете заставить PHP сгенерировать
скелет класса приёмника событий, используя
У меня возникают проблемы при попытке вызвать метод COM объекта,
который предоставляет более чем один интерфейс. Что я могу сделать?
Ответ так же прост как и неудовлетворителен. Не знаю точно, но думаю,
что вы не можете ничего сделать. Если у кого-то есть точная
информация по этому вопросу, пожалуйста, дайте
мне знать :)
COM+ расширяет COM, предоставляя систему для управления компонентами
через MTS и MSMQ, но здесь нет ничего особенного, что PHP должен
поддерживать для использования таких компонент.
Если PHP может манипулировать COM объектами, можно ли представить себе
использование MTS для управления ресурсами компонентов
в соединении с PHP?
Сам PHP ещё не обрабатывает транзакции. Таким образом, если возникает
ошибка, откат не инициируется. Если вы используете компоненты,
поддерживающие транзакции, вам будет необходимо реализовать
управление транзакциями самим.