Учебник PHP

         

Глава 52. 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. Можно ли загрузить/манипулировать ActiveX-объектом на странице с помощью РНP ?
11. Можно ли получить работающий экземпляр компонента ?
12. Есть ли способ обработать событие, посланное от COM-объекта ?
13. У меня появились проблемы при попытке вызвать метод COM-объекта, имеющего не один интерфейс. Что можно предпринять ?
14. Итак, PHP работает COM, а как насчёт COM+ ?
15. Если PHP может манипулировать COM-объектами, можно ли представить

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

1. Я построил DLL для расчётов. Есть ли способ запустить эту DLL под PHP ?

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

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

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

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

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

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

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

5. Как я могу отловить COM-ошибки ?

В настоящее время невозможно отлавливать COM-ошибки другими способами, помимо тех, которые предоставлены в самом PHP (@, track_errors, ..), но мы думаем над реализацией этого.

6. Могу ли я генерировать DLL-файлы в PHP-скриптах, как я это делаю в Perl ?

Нет, к сожалению, такой утилиты для PHP нет.

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

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

  • неправильный CLSID

  • запрошенная DLL отсутствует

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

8. Как я могу запустить COM-объект с удалённого сервера ?

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

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

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

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

10. Можно ли загрузить/манипулировать ActiveX-объектом на странице с помощью РНP ?

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

11. Можно ли получить работающий экземпляр компонента ?

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

Содержание раздела