| ||||||||||
Глава 52. PHP и COMPHP может использоваться для доступа к COM и DCOM-объектам на платформе Win32.
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}' ? Эта ошибка может появиться по разным причинам:
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, вы можете создать этот экземпляр так:
Это создаст новый экземпляр, если нет доступного работающего экземпляра, или буде возвращён дескриптор/handle работающего экземпляра, если он имеется. 12. Есть ли способ обработать событие, посланное от COM-объекта ? Пока нет. 13. У меня появились проблемы при попытке вызвать метод COM-объекта, имеющего не один интерфейс. Что можно предпринять ? Ни шиша. Я точно не знаю, но думаю, что ничего. Если кто-нибудь имеет информацию об этом, пожалуйста, дайте мне знать. 14. Итак, PHP работает COM, а как насчёт COM+ ? COM+ расширяет COM с помощью каркаса для обслуживания компонентов через MTS и MSMQ, но нет ничего специального для обслуживания таких компонентов в PHP. 15. Если PHP может манипулировать COM-объектами, можно ли представить использование MTS для обслуживания ресурсов компонентов в соединении с PHP ? Сам PHP ещё не может обслуживать транзакции. Таким образом, если возникает ошибка, откат не инициируется. Если вы используете компоненты, которые поддерживают транзакции, вам нужно будет реализовать обслуживание транзакций самостоятельно. | ||||||||||
|