PHP: PHPとCOM - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<PHPとHTMLPHPと他の言語>
view the version of this page
Last updated: Tue, 21 Dec 2004

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

1. とある計算を行うDLLを作成しました。これをPHPで実行させる方法はあ りますか?

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

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

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

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

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

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

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

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

現在の所、PHPが提供する方法(@, track_errors, ...)を使用してCOMの エラーをトラップすることはできません。しかし、私たちはこれを実装 する方法を検討中です。

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

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

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

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

  • CLSIDが正しくない

  • 要求されたDLLが無い

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

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

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

php.inicom.allow_dcom=trueをセットするのを忘れないで ください。

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

php.iniを編集して com.allow_dcom=trueとして下さい。

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

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

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

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

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

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

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

PHP 4.3.0から、イベントシンクを定義してそれにバインドすることが できるようになりました。以下の例を見てください。イベントシンククラス のスケルトンをPHPに生成させるためにはcom_print_typeinfo() を利用できます。

例 71-1. COM event sink example

<?php
class IEEventSinker {
  var
$terminated = false;

  function
ProgressChange($progress, $progressmax) {
   echo
"Download progress: $progress / $progressmax\n";
  }

  function
DocumentComplete(&$dom, $url) {
   echo
"Document $url complete\n";
  }

  function
OnQuit() {
   echo
"Quit!\n";
  
$this->terminated = true;
  }
}
$ie = new COM("InternetExplorer.Application");
$sink =& new IEEventSinker();
com_event_sink($ie, $sink, "DWebBrowserEvents2");
$ie->Visible = true;
$ie->Navigate("http://www.php.net");
while(!
$sink->terminated) {
 
com_message_pump(4000);
}
$ie = null;
?>

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

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

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

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

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

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



add a note add a note User Contributed Notes
PHPとCOM
jeanpierre dot vincent at gmail dot com
03-Feb-2005 02:56
Be careful with function com_event_sink(), it doesn't totally work : when catching events, all parameters given to your callback function have the same value as the last one => see bug
junk.ghost@virgin dOtt net
05-Oct-2004 04:27
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.
ALAN at DONTSPAMMEE;HOGAR dot COM
17-Aug-2002 04:39
ONE SAMPLE USING MS-XML3 PARSER ON WINDOWS
<?
  $xml
= new COM("Microsoft.XMLDOM");
 
$xml->async=false;
 
$xml->load("STYLE.xml");
 
$xsl = new COM("Microsoft.XMLDOM");
 
$xsl->async=false;
 
$xsl->load("STYLE.xsl");
 
$response=$xml->transformNode($xsl);
  print
$response;
?>

<PHPとHTMLPHPと他の言語>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page