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 на сторінці за допомогою PHP?
  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, які ви можете ловити, щоб визначити і оглянути проблемну частину коду.

Чи я можу генерувати файли DLL скриптами PHP, так як це робив на Perl?

Ні, на жаль на PHP такий інструмент недоступний.

Що означає "Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"?

Ця помилка може бути з декількох причин:

  • неправильний CLSID
  • необхідна DLL відсутня
  • запитуваний компонент не реалізує інтерфейс IDispatch

Як мені запускати об'єкти COM з віддаленого сервера?

Так само, як і локальні об'єкти. Вам лише треба передати другим параметром конструктору COM IP віддаленої машини.

Переконайтеся, що ви визначили com.allow_dcom=true у вашому php.ini.

Я отримую "DCOM is disabled in C:\path...\scriptname.php on line 6", що я можу зробити?

Відредагуйте ваш php.ini, задавши com.allow_dcom=true.

Чи можливо завантажувати/маніпулювати об'єктом ActiveX на сторінці за допомогою PHP?

Це не має нічого спільного з PHP. Об'єкти ActiveX завантажуються у клієнтський код за запитом документа HTML. Це не стосується скрипту PHP, тому пряма взаємодія на стороні сервера неможлива.

Чи можливо отримати запущений екземпляр компонента?

Це можливо завдяки псевдонімам. Якщо треба отримати численні посилання на той самий екземпляр слова, ви можете створити цей екземпляр, як показано:

<?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 сам ще не обробляє транзакції. Таким чином, якщо виникає помилка, відкочування не починається. Якщо ви використовуєте компоненти, які підтримують транзакції, вам треба власноруч реалізувати управління транзакціями.