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.PHP и COM
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
PHP и COM
Референца за `faq.com.php` со подобрена типографија и навигација.
PHP и COM
PHP може да се користи за пристап до COM и DCOM објекти на Win32 платформи.
- PHP може да се користи за пристап до COM и DCOM објекти на Win32 платформи.
- Изградив DLL за да пресметам нешто. Има ли начин да го стартувам овој DLL под PHP?
- Што значи 'Неподдржан тип на варијанта: xxxx (0xxxxx)'?
- Дали е можно да се манипулираат визуелни објекти во PHP?
- Може ли да чувам COM објект во сесија?
- Како можам да фатам COM грешки?
- Може ли да генерирам DLL датотеки од PHP скрипти како што можам во Perl?
- Што значи 'Не може да се добие IDispatch интерфејс за CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
- Како можам да стартувам COM објект од оддалечен сервер?
- Добивам 'DCOM е оневозможен во C:\path...\scriptname.php на линија 6', што можам да направам?
- Дали е можно да се вчита/манипулира ActiveX објект во страница со PHP?
- Дали е можно да се добие активна инстанца на компонента?
- Има ли начин да се справиме со настан испратен од COM објект?
- Имам проблеми кога се обидувам да повикам метод на COM објект што открива повеќе од еден интерфејс. Што можам да направам?
- Значи PHP работи со COM, што е со COM+?
- PHP може да се користи за пристап до COM и DCOM објекти на Win32 платформи.
-
Ако PHP може да манипулира COM објекти, можеме ли да замислиме да користиме MTS за управување со ресурсите на компонентите, во комбинација со PHP?
- Изградив DLL за да пресметам нешто. Има ли начин да го стартувам овој DLL под PHP?
-
Ако ова е едноставен DLL, нема начин засега да се стартува од PHP. Ако DLL содржи COM сервер, можеби ќе можете да пристапите до него ако го имплементира IDispatch интерфејсот.
- Што значи 'Неподдржан тип на варијанта: xxxx (0xxxxx)'?
-
Постојат десетици типови на VARIANT и нивни комбинации. Повеќето од нив се веќе поддржани, но неколку сè уште треба да се имплементираат. Низите не се целосно поддржани. Само еднодимензионални индексирани низи можат да се пренесуваат помеѓу PHP и COM. Ако најдете други типови што не се поддржани, ве молиме пријавете ги како грешка (ако веќе не се пријавени) и обезбедете што е можно повеќе информации.
- Дали е можно да се манипулираат визуелни објекти во PHP?
-
Генерално е така, но бидејќи PHP најчесто се користи како јазик за скриптирање на веб, тој работи во контекст на веб-серверот, оттука визуелните објекти никогаш нема да се појават на работната површина на серверот. Ако користите PHP за скриптирање апликации, на пр. во комбинација со PHP-GTK, нема ограничување во пристапот и манипулирањето со визуелни објекти преку COM.
- Може ли да чувам COM објект во сесија?
-
COM екстензијата фрла
com_exceptionCOM екстензијата фрлаcodeисклучоци, кои можете да ги фатите и потоа да го проверите
- Како можам да фатам COM грешки?
-
член за да одредите што да правите понатаму.
- Може ли да генерирам DLL датотеки од PHP скрипти како што можам во Perl?
-
Не, за жал нема таков алат достапен за PHP.
- Оваа грешка може да има повеќе причини:
- CLSID е погрешен
- бараниот DLL недостасува
- Што значи 'Не може да се добие IDispatch интерфејс за CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
-
бараниот компонент не ја имплементира IDispatch интерфејсот
Точно како што ги стартувате локалните објекти. Треба само да го поминете IP-то на оддалечената машина како втор параметар на COM конструкторот. com.allow_dcom
=true, можно забавувајќи напаѓач кој се обидува да открие слабости во вашиот систем. Со поставување expose_php на php.ini.
- Како можам да стартувам COM објект од оддалечен сервер?
-
Уредете го вашиот php.ini Проверете дали сте поставиле com.allow_dcom
=true.
- Добивам 'DCOM е оневозможен во C:\path...\scriptname.php на линија 6', што можам да направам?
-
и поставете
- Дали е можно да се вчита/манипулира ActiveX објект во страница со PHP?
-
Ова нема никаква врска со PHP. ActiveX објектите се вчитуваат на страна на клиентот ако се бараат од HTML документот. Нема врска со PHP скриптата и затоа не е можно директно интеракција на страна на серверот.
<?php
$word = new COM("C:\docs\word.doc");
?>Ова е можно со помош на моникерс. Ако сакате да добиете повеќе референци за истата инстанца на зборот, можете да ја креирате таа инстанца како што е прикажано:
- Дали е можно да се добие активна инстанца на компонента?
-
Ова ќе создаде нова инстанца ако нема активна инстанца или ќе врати рачка до активната инстанца, ако е достапна. com_event_sink()Можете да дефинирате event sink и да го поврзете користејќи com_print_typeinfo() . Можете да користите
- Има ли начин да се справиме со настан испратен од COM објект?
-
за PHP да генерира скелет за event sink класата.
- Имам проблеми кога се обидувам да повикам метод на COM објект што открива повеќе од еден интерфејс. Што можам да направам?
-
Одговорот е едноставен колку што е незадоволителен. Не знаеме точно, но мислиме дека ништо не можете да направите.
- Значи PHP работи со COM, што е со COM+?
-
COM+ го проширува COM со рамка за управување со компоненти преку MTS и MSMQ, но нема ништо посебно што PHP треба да поддржи за да користи такви компоненти.
Белешки од корисници 3 белешки
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.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.