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 для кое-каких вычислений. Можно ли запустить эту DLL из PHP?

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

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

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

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

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

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

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

Как я могу поймать COM ошибки?

COM расширение кидает исключение com_exception, которое вы можете перехватить и затем проверить у него поле code, чтобы понять, что делать дальше.

Можно ли генерировать DLL файлы из PHP скриптов как это можно делать в Perl?

Нет, к сожалению такое средство недоступно для PHP.

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

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

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

Как можно запускать COM объекты с удаленного сервера?

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

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

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

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

Возможно ли с помощью PHP загрузить/манипулировать ActiveX объектом на странице?

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

Возможно ли получить выполняющийся экземпляр компонента?

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

<?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 еще не обрабатывает транзакции. Таким образом, если возникает ошибка, откат не инициируется. Если вы используете компоненты, поддерживающие транзакции, вам будет необходимо реализовать управление транзакциями самим.

Коментарии

ONE SAMPLE USING MS-XML3 PARSER ON WINDOWS
<?
  $xml
= new COM("Microsoft.XMLDOM");
 
$xml->async=false;
 
$xml->load("STYLE.xml");
 
$xsl = new COM("Microsoft.XMLDOM");
 
$xsl->async=false;
 
$xsl->load("STYLE.xsl");
 
$response=$xml->transformNode($xsl);
  print 
$response;
?>
2002-08-17 00:39:43
http://php5.kiev.ua/manual/ru/faq.com.html
It may be obvious to everyone else but...

If you want to write your own COM DLL in MSVC++6 and you want to pass it a string, you need the following in your .idl file:

HRESULT function_name([in] BSTR parameter_name,
                      [retval, out] BSTR * retval);

retval is the result of your function as a string to be passed back.

BSTR is an unsigned short *, so if you want to use your string with STL string etc. you may need to convert parameters to and from char *.

The burden of my message is that from PHP

$comThing = new COM("comThing.comThing");
print $comThing->function_name("Jeremy");

Jeremy will be marshalled as wide chars, which match BSTR.
2004-10-05 12:27:23
http://php5.kiev.ua/manual/ru/faq.com.html
Автор:
Re: The Windows English CHM Sample with MS Word Automation.

I see that $Word->Release() is called after $Word->Quit().
This seems to be erroneous. Actually, $Word->Release() should not have to be called if proper COM garbage collection is taking place. Release() is a C++ construction not used in either Visual Basic or VBScript or even MS-JScript. Just to be sure, however, I ran the sample through php.exe (5.04 CLI on Windows XP SP1 with Office 2003) and got a RPC failed error on the line containing $Word->Release(). The rest of the sample works fine, and the results are as expected. So, I propose 2 scenarios:
      1.There is a problem with the documentation (more likely).
      2.There is a problem with PHP504 itself, as this problem is reproduced with any COM Automation call, not just Word.
2005-07-17 07:56:41
http://php5.kiev.ua/manual/ru/faq.com.html
in response to item #1 above:  "If this is a simple DLL there is no way yet to run it from PHP."

Answer: There are several different packages/add-ons to php that enable low level access to the windows api. One of the most popular of these packages is available at http://www.winbinder.org

Winbinder does have the ability to load a dll and call it's functions.  Winbinder also provides a large set of windows apis for creating windows and controls.  This is useful for creating stand-alone desktop apps.  It is a possible alternative to php-gtk.

I've had mixed results with Winbinder, some things work very well, others are buggy; source code is available.  It's worth a look, Evaluate carefully.
2007-01-27 07:18:59
http://php5.kiev.ua/manual/ru/faq.com.html
In reference to question 1:

On one project I had a dll that exposed certain functions I wished to call from within PHP.  I created a PHP Module which had a matching function for each in the DLL.  The PHP Module did no processing, merely served as an adapter for the original DLL.
2008-07-09 14:29:52
http://php5.kiev.ua/manual/ru/faq.com.html

    Поддержать сайт на родительском проекте КГБ