Kapitola 52. 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?

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 přistupovat , pokud implementuje interface IDispatch .

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 .

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 .

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 .

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 .

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

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

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



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 .

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 .

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 .

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 :




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

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

Zatím ne .

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 někdo specifické informace o tomto problému , laskavě napíše sem .

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 .

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í .