# 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 を 使ってコンポーネントリソースを扱えると考えてもよいということですか？

とある計算を行う 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 の出力するエラーをトラップできますか?

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

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

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

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

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

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

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

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

  php.ini に com.allow_dcom=`TRUE` をセットするのを忘れないでください。

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

  php.ini を編集して com.allow_dcom=`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 それ自体はまだトランザクションをサポートしていません。従って エラーが発生してもロールバック処理は行われません。もし トランザクションをサポートするコンポーネントを使用する場合は、 自分でトランザクション処理を実装する必要があります。