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, вы можете создать этот экземпляр так:
$word = new COM("C:docsword.doc");
Это создаст новый экземпляр, если нет доступного работающего экземпляра,
или буде возвращён дескриптор/handle работающего экземпляра, если он имеется.
12. Есть ли способ обработать событие, посланное от COM-объекта ?
Пока нет.
13. У меня появились проблемы при попытке вызвать метод COM-объекта, имеющего
не один интерфейс. Что можно предпринять ?
Ни шиша. Я точно не знаю, но думаю, что ничего.
Если кто-нибудь имеет информацию об этом, пожалуйста, дайте мне знать.
14. Итак, PHP работает COM, а как насчёт COM+ ?
COM+ расширяет COM с помощью каркаса для обслуживания компонентов через MTS
и MSMQ, но нет ничего специального для обслуживания таких компонентов в PHP.
15. Если PHP может манипулировать COM-объектами, можно ли представить
использование MTS для обслуживания ресурсов компонентов в соединении с PHP ?
Сам PHP ещё не может обслуживать транзакции. Таким образом, если возникает
ошибка, откат не инициируется. Если вы используете компоненты, которые
поддерживают транзакции, вам нужно будет реализовать обслуживание транзакций
самостоятельно.