FAQ
PHP Manual

PHP と COM

PHP は Win32 プラットフォーム上で COM と DCOM オブジェクトに アクセスすることができます。

  1. ã?¨ã??ã??è¨?ç®?ã??è¡?ã?? DLL ã??ä??æ??ã??ã??ã??ã??ã??ã??ã??ã?? PHP ã?§å®?è¡?ã??ã??ã??æ??æ??ã?¯ ã??ã??ã??ã??ã???
  2. 'Unsupported variant type: xxxx (0xxxxx)'ã?¨ã?¯ã?©ã??ã??ã??æ??å??ã?§ã??ã???
  3. PHP ã?§ã??ã?¸ã??ã?¢ã??ã?ªã??ã?¸ã?§ã?¯ã??ã??æ??ä??ã?§ã??ã??ã??ã???
  4. COM ã?ªã??ã?¸ã?§ã?¯ã??ã??ã??ã??ã??ã?§ã??æ??å?±ã?¨ã??ã?¦ä¿?å??ã?§ã??ã??ã??ã???
  5. COM ã?®å?ºå??ã??ã??ã?¨ã?©ã??ã??ã??ã?©ã??ã??ã?§ã??ã??ã??ã???
  6. PHP ã??ã?¯ã?ªã??ã??ã??ã?? DLL ã??ä??æ??ã??ã??ã??ã?¨ã?¯ã?§ã??ã??ã??ã??? 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. 2 ã?¤ä??ä¸?ã?®ã?¤ã??ã?¿ã??ã??ã?§ã??ã??ã??å?¬é??ã??ã?¦ã??ã?? COM ã?ªã??ã?¸ã?§ã?¯ã??ã?®ã?¡ã??ã??ã??ã?? å??ã??å?ºã??ã??ã?¨ã??ã?¦å?°ã?£ã?¦ã??ã??ã??ã??ã?©ã??ã??ã??ã?°ã??ã??ã?§ã??ã???
  14. PHP ã?¯ COM ã??æ?±ã??ã??ã?¨ã??ã??ã??ã?¨ã?¯å??ã??ã??ã??ã??ã??ã??ã?§ã?¯ COM+ ã??ã?¤ã??ã?¦ã?¯ ã?©ã??ã?§ã??ã???
  15. PHP ã?? COM ã?ªã??ã?¸ã?§ã?¯ã??ã??æ??ä??ã??ã??ã??ã?¨ã??ã?§ã??ã??ã?¨ã??ã??ã??ã?¨ã?¯ã??MTS ã?? ä?¿ã?£ã?¦ã??ã??ã??ã??ã??ã??ã??ã?ªã??ã??ã??ã??æ?±ã??ã??ã?¨è??ã??ã?¦ã??ã??ã??ã?¨ã??ã??ã??ã?¨ã?§ã??ã??ï??
  16. とある計算を行う DLL を作成しました。これを PHP で実行させる方法は ありますか?

    もしそれが普通の DLL なら、現在のところ PHP からそれを実行する手段は ありません。DLL が COM サーバを含んでいて IDispatch インターフェースが 実装されている場合、PHP からアクセスすることができます。

    'Unsupported variant type: xxxx (0xxxxx)'とはどういう意味ですか?

    多くの VARIANT タイプとその組み合わせがあり、そのほとんどは サポートされていますが、残りのいくつかは未だ実装されていません。 また配列も完全にサポートされているわけではなく、PHP と COM の間で 受け渡しが可能なのは 1 次元の添字付配列のみです。もしこの他に サポートされていないタイプを見つけた場合は(既知でなければ)、 できる限りの情報を添えてバグとして報告してください。

    PHP でビジュアルオブジェクトを操作できますか?

    基本的には可能です。しかし PHP はほとんどの場合ウェブスクリプティングの 言語として使用されウェブサーバ上で実行されるため、ビジュアルオブジェクトが サーバのデスクトップに現れることはありません。もし PHP を アプリケーション作成に使用する、すなわち PHP-GTK と合わせて 使用する場合にはアクセスに制限はありません。COM を通じて ビジュアルオブジェクトを操作することができます。

    COM オブジェクトをセッション情報として保存できますか?

    できません。COM インスタンスはリソースとして扱われるため、1 つの スクリプトを実行している間のみ使用可能です。

    COM の出力するエラーをトラップできますか?

    PHP 5 では、COM 拡張モジュールは com_exception 例外をスローします。これをキャッチし、code メンバを調べることで次にすべきことを決定できます。

    PHP 4 では、PHP が提供する方法(@, track_errors, ...)を使用して COM のエラーをトラップすることはできません。

    PHP スクリプトから DLL を作成することはできますか? Perl では できるのですが。

    いいえ、残念ながら PHP にはそのようなツールはありません。

    'Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'とはどういう意味ですか?

    このエラーが発生する理由はいくつかあります。

    • CLSID が正しくない
    • 要求された DLL が無い
    • 要求されたコンポーネントが IDispatch インターフェースを実装していない

    COM オブジェクトをリモートサーバから実行するにはどうすればよいですか?

    ローカルオブジェクトを実行するのと全く同様です。ただ、COM コンストラクタの 2 番目のパラメータにリモートマシンの IP アドレスを 渡すだけです。

    php.iniCOM=TRUE をセットするのを忘れないでください。

    'DCOM is disabled in C:\path...\scriptname.php on line 6' という エラーが発生しました。どうすればよいですか?

    php.ini を編集して COM=TRUE としてください。

    PHP を使用したページで ActiveX オブジェクトをロード/操作することは できますか?

    これは PHP とは関係ありません。ActiveX オブジェクトは、HTML ドキュメントから要求があった場合にクライアント側でロードされます。 PHP スクリプトとは関係が無く、従ってサーバ側と直接やりとりすることも できません。

    実行中のコンポーネントのインスタンスを取得することはできますか?

    モニカーを使用すれば可能です。同じ Word インスタンスに対して複数の 参照を取得したい場合は、以下のようにしてインスタンスを生成します。

    <?php
    $word = new COM("C:\docs\word.doc");
    ?>
    

    こうすれば、実行中のインスタンスが無い、もしくはインスタンスの 取得が不可能だった場合には新規に生成され、インスタンスが取得できた 場合にはそのハンドルを返します。

    COM オブジェクトから送られてくるイベントを扱う方法はありますか?

    イベントシンクを定義し、com_event_sink() を使用してそれをバインドすることが可能です。PHP でイベントシンククラスの 雛形を作成するために com_print_typeinfo() を 使用することが可能です。

    2 つ以上のインターフェースを公開している COM オブジェクトのメソッドを 呼び出そうとして困っています。どうすればよいですか?

    この問題に対する答えは、簡単ですが残念なものです。正確には わかりませんが、おそらく打つ手はありません。もしこの問題に関する 具体的な情報があったら» 私 に教えてください。

    PHP は COM を扱えるということは分かりました。では COM+ については どうですか?

    COM+ とは MTS(Microsoft Transaction Server) と MSMQ(Microsfot Message Queue Service) を通じてコンポーネントを操作する フレームワークによって COM を拡張したものです。が、PHP がそういった コンポーネントをサポートするにあたって特別に必要なことはありません。

    PHP が COM オブジェクトを操作することができるということは、MTS を 使ってコンポーネントリソースを扱えると考えてもよいということですか?

    PHP それ自体はまだトランザクションをサポートしていません。従って エラーが発生してもロールバック処理は行われません。もし トランザクションをサポートするコンポーネントを使用する場合は、 自分でトランザクション処理を実装する必要があります。


FAQ
PHP Manual