Forum und email
PHP a COM

Kapitola 57. PHP a COM

PHP lze na platformách Win32 použít k přístupu k objektům COM a DCOM.

1. Zkompiloval jsem knihovnu DLL k nějakým výpočtům. Existuje způsob, jak tuto knihovnu spustit pod PHP?
2. Co znamená 'Unsupported variant type: xxxx (0xxxxx)'?
3. Je možné v PHP manipulovat vizuálními objekty?
4. Mohu ukládat COM objekty do session?
5. Jak mohu zachycovat chyby COM?
6. Mohu generovat knihovny DLL z PHP skriptů, podobně jako v Perlu?
7. Co znamená 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?
8. Jak lze spustit objekt COM ze vzdáleného serveru?
9. Zobrazilo se 'DCOM is disabled in C:\path...\scriptname.php on line 6', co mám dělat?
10. Lze načíst objekt ActiveX na stránce, resp. s ním manipulovat, pomocí PHP?
11. Je možné získat běžící instanci komponenty?
12. Existuje způsob, jak obsloužit událost odeslanou z objektu COM?
13. Mám problémy, když se pokouším vyvolat metodu objektu COM, která vystavuje více než jeden interface. Co mám dělat?
14. Když PHP pracuje s COM, jak je to s COM+?
15. Jestliže může PHP manipulovat s objekty COM, lze si představit použití MTS ke správě prostředků komponent společně s PHP?

1. Zkompiloval jsem knihovnu DLL k nějakým výpočtům. Existuje způsob, jak tuto knihovnu spustit pod PHP?

Pokud je to jednoduchá DLL knihovna, zatím ji není možné spustit z PHP. Pokud však tato knihovna obsahuje COM server, můžete k ní přistupovat, pokud implementuje interface IDispatch.

2. Co znamená 'Unsupported variant type: xxxx (0xxxxx)'?

Existují tucty typů VARIANT a jejich kombinací. Většina z nich je již podporována, ale několik z nich teprve musí být implementováno. Pole nejsou podporována plně. Mezi PHP a COM lze vyměňovat pouze jednorozměrná indexovaná pole. Pokud najdete jiné typy, které nejsou podporovány, ohlašte je prosím jako chybu - bug (pokud již nebyly ohlášeny) a poskytněte o nich tolik informací, kolik můžete.

3. Je možné v PHP manipulovat vizuálními objekty?

Obecně je, ale protože PHP se nejčastěji používá jako webovský skriptovací jazyk, běží v prostředí WWW serveru, a proto se vizuální objekty nezobrazují na ploše displeje serveru. Pokud používáte PHP pro aplikační skriptování, např. společně s PHP-GTK, neexistuje omezení přístupu a manipulace s vizuálními objekty pomocí COM.

4. Mohu ukládat COM objekty do session?

Nemůžete. S instancemi COM se nakládá jako s prostředky a proto jsou k dispozici pouze v kontextu jediného skriptu.

5. Jak mohu zachycovat chyby COM?

Momentálně není možné zachycovat chyby COM kromě způsobů poskytovaných samotným PHP (@, track_errors, ...), nicméně přemýšlíme o způsobu, jak to implementovat.

6. Mohu generovat knihovny DLL z PHP skriptů, podobně jako v Perlu?

Ne, v PHP bohužel není takový nástroj k dispozici.

7. Co znamená 'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'?

Tato chyba může mít více příčin:

  • hodnota CLSID je chybná

  • chybí požadovaná DLL knihovna

  • požadovaná komponenta neimplementuje interface IDispatch

8. Jak lze spustit objekt COM ze vzdáleného serveru?

Přesně tak, jak spouštíte místní objekty. Musíte pouze použít IP adresu vzdáleného stroje jako druhý parametr konstruktoru COM.

Ujistěte se, že je nastaveno com.allow_dcom=true v souboru php.ini.

9. Zobrazilo se 'DCOM is disabled in C:\path...\scriptname.php on line 6', co mám dělat?

Upravte soubor php.ini - nastavte tam com.allow_dcom=true.

10. Lze načíst objekt ActiveX na stránce, resp. s ním manipulovat, pomocí PHP?

To nemá s PHP nic společného. Objekty ActiveX se načítají na straně klienta, pokud jsou vyžádány HTML dokumentem. Nemá to žádnou souvislost s PHP skriptem a proto není možná žádná přímá interakce na straně serveru.

11. Je možné získat běžící instanci komponenty?

Je to možné pomocí "monikerů". Pokud chcete získat více referencí na tutéž instanci, můžete vytvořit tuto instanci tímto způsobem:

$word = new COM("C:\docs\word.doc");

Toto vytvoří novou instanci, pokud není k dispozici žádná běžící instance, resp. vrátí handle na běžící instanci.

12. Existuje způsob, jak obsloužit událost odeslanou z objektu COM?

Zatím ne.

13. Mám problémy, když se pokouším vyvolat metodu objektu COM, která vystavuje více než jeden interface. Co mám dělat?

Odpověď je stejně tak jednoduchá, jako neuspokojivá. Nelze to říci přesně, ale asi nemůžete dělat nic. Pokud má někdo specifické informace o tomto problému, ať laskavě napíše sem.

14. Když PHP pracuje s COM, jak je to s COM+?

COM+ rozšiřuje COM rámec pro správu komponent přes MTS a MSMQ, ale není to nic zvláštního na to, aby PHP muselo takové komponenty podporovat.

15. Jestliže může PHP manipulovat s objekty COM, lze si představit použití MTS ke správě prostředků komponent společně s PHP?

PHP samotné nemůže zatím obsluhovat transakce. Proto když nastane chyba, není iniciován žádný rollback. Pokud používáte komponenty, které podporují transakce, budete muset implementovat vlastní mechanismus správy transakcí.