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.
PHP и COM
PHP может быть использован для доступа к COM и DCOM объектам на Win32 платформах.
- Я построил DLL для вычисления кое-чего. Можно ли запустить эту DLL из PHP?
- Что значит 'Unsupported variant type: xxxx (0xxxxx)'?
- Возможно ли манипулирование визуальными объектами в PHP?
- Могу ли я сохранять COM объекты в сессии?
- Как я могу поймать COM ошибки?
- Можно ли генерировать DLL файлы из PHP скриптов как это можно делать в Perl?
- Что значит 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
- Как можно запускать COM объекты с удалённого сервера?
- Я получаю 'DCOM is disabled in C:\path...\scriptname.php on line 6', что делать?
- Возможно ли с помощью PHP загрузить/манипулировать ActiveX объектом на странице?
- Возможно ли получить выполняющийся экземпляр компонента?
- Есть ли способ обработать событие, посланное COM объектом?
- У меня возникают проблемы при попытке вызвать метод COM объекта, который предоставляет более чем один интерфейс. Что я могу сделать?
- Значит PHP работает с COM, как насчёт COM+?
- Если 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 ошибки?
-
В PHP 5 COM расширение возбуждает исключение com_exception, которое вы можете перехватить и затем проверить поле code для того, чтобы определить что делать дальше.
В PHP 4 поймать COM ошибки средствами, отличными от тех, что предлагает сам PHP (@, track_errors, ...) невозможно.
-
Можно ли генерировать DLL файлы из PHP скриптов как это можно делать в Perl?
-
Нет, к сожалению такое средство недоступно для PHP.
-
Что значит 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
-
Эта ошибка может возникнуть по разным причинам:
- неправильный CLSID
- отсутствует запрошенная DLL
- запрошенный компонент не реализует интерфейс IDispatch
-
Как можно запускать COM объекты с удалённого сервера?
-
Точно так же как вы запускаете локальные объекты. Вам только надо передать IP удалённой машины как второй параметер COM конструктора.
Убедитесь, что в вашем php.ini вы установили Настройка во время выполнения=TRUE.
-
Я получаю 'DCOM is disabled in C:\path...\scriptname.php on line 6', что делать?
-
Отредактируйте ваш php.ini и установите Настройка во время выполнения=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 ещё не обрабатывает транзакции. Таким образом, если возникает ошибка, откат не инициируется. Если вы используете компоненты, поддерживающие транзакции, вам будет необходимо реализовать управление транзакциями самим.
PHP и COM
09-Jul-2008 11:29
27-Jan-2007 05:18
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.
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.
03-Feb-2005 06:56
Be careful with function com_event_sink(), it doesn't totally work : when catching events, all parameters given to your callback function have the same value as the last one => see bug http://bugs.php.net/bug.php?id=31040
05-Oct-2004 09:27
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.
16-Aug-2002 09:39
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;
?>
