<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'faq.com.php',
    1 => 'PHP と COM',
    2 => 'PHP と COM',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'FAQ',
  ),
  'prev' => 
  array (
    0 => 'faq.html.php',
    1 => 'PHP と HTML',
  ),
  'next' => 
  array (
    0 => 'faq.misc.php',
    1 => 'その他の質問',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'faq/com.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.com" class="chapter">
  <h1 class="title">PHP と COM</h1>

  

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

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.com.q1">
     
      とある計算を行う DLL を作成しました。これを PHP で実行させる方法は
      ありますか?
     
    </a></li><li><a href="#faq.com.q2">
     
      &#039;Unsupported variant type: xxxx (0xxxxx)&#039;とはどういう意味ですか?
     
    </a></li><li><a href="#faq.com.q3">
     PHP でビジュアルオブジェクトを操作できますか?
    </a></li><li><a href="#faq.com.q4">
     COM オブジェクトをセッション情報として保存できますか?
    </a></li><li><a href="#faq.com.q5">
     COM の出力するエラーをトラップできますか?
    </a></li><li><a href="#faq.com.q6">
     
      PHP スクリプトから DLL を作成することはできますか? Perl では
      できるのですが。
     
    </a></li><li><a href="#faq.com.q7">
     
      &#039;Unable to obtain IDispatch interface for CLSID
      {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&#039;とはどういう意味ですか?
     
    </a></li><li><a href="#faq.com.q8">
     
      COM オブジェクトをリモートサーバーから実行するにはどうすればよいですか?
     
    </a></li><li><a href="#faq.com.q9">
     
      &#039;DCOM is disabled in C:\path...\scriptname.php on line 6&#039; という
      エラーが発生しました。どうすればよいですか？
     
    </a></li><li><a href="#faq.com.q10">
     
      PHP を使用したページで ActiveX オブジェクトをロード/操作することは
      できますか?
     
    </a></li><li><a href="#faq.com.q11">
     
      実行中のコンポーネントのインスタンスを取得することはできますか?
     
    </a></li><li><a href="#faq.com.q12">
     
      COM オブジェクトから送られてくるイベントを扱う方法はありますか？
     
    </a></li><li><a href="#faq.com.q13">
     
      2 つ以上のインターフェイスを公開している COM オブジェクトのメソッドを
      呼び出そうとして困っています。どうすればよいですか?
     
    </a></li><li><a href="#faq.com.q14">
     
      PHP は COM を扱えるということは分かりました。では COM+ については
      どうですか?
     
    </a></li><li><a href="#faq.com.q15">
     
      PHP が COM オブジェクトを操作することができるということは、MTS を
      使ってコンポーネントリソースを扱えると考えてもよいということですか？
     
    </a></li></ol></div>
   <dl class="qandaentry" id="faq.com.q1">
    <dt><strong>
     
      とある計算を行う DLL を作成しました。これを PHP で実行させる方法は
      ありますか?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      もしそれが普通の DLL なら、現在のところ PHP からそれを実行する手段は
      ありません。DLL が COM サーバーを含んでいて IDispatch インターフェイスが
      実装されている場合、PHP からアクセスすることができます。
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q2">
    <dt><strong>
     
      &#039;Unsupported variant type: xxxx (0xxxxx)&#039;とはどういう意味ですか?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      多くの VARIANT タイプとその組み合わせがあり、そのほとんどは
      サポートされていますが、残りのいくつかは未だ実装されていません。
      また配列も完全にサポートされているわけではなく、PHP と COM の間で
      受け渡しが可能なのは 1 次元の添字付配列のみです。もしこの他に
      サポートされていないタイプを見つけた場合は(既知でなければ)、
      できる限りの情報を添えてバグとして報告してください。
     </p>
    </dd>
   </dl>
  
   <dl class="qandaentry" id="faq.com.q3">
    <dt><strong>
     PHP でビジュアルオブジェクトを操作できますか?
    </strong></dt>
    <dd class="answer">
     <p class="para">
      基本的には可能です。しかし PHP はほとんどの場合ウェブスクリプティングの
      言語として使用されウェブサーバー上で実行されるため、ビジュアルオブジェクトが
      サーバーのデスクトップに現れることはありません。もし PHP を
      アプリケーション作成に使用する、すなわち PHP-GTK と合わせて
      使用する場合にはアクセスに制限はありません。COM を通じて
      ビジュアルオブジェクトを操作することができます。
     </p>
    </dd>
   </dl>
  
   <dl class="qandaentry" id="faq.com.q4">
    <dt><strong>
     COM オブジェクトをセッション情報として保存できますか?
    </strong></dt>
    <dd class="answer">
     <p class="para">
      できません。COM インスタンスはリソースとして扱われるため、1 つの
      スクリプトを実行している間のみ使用可能です。
     </p>
    </dd>
   </dl>
  
   <dl class="qandaentry" id="faq.com.q5">
    <dt><strong>
     COM の出力するエラーをトラップできますか?
    </strong></dt>
    <dd class="answer">
     <p class="para">
      COM 拡張モジュールは <code class="literal">com_exception</code>
      例外をスローします。これをキャッチし、<code class="literal">code</code>
      メンバを調べることで次にすべきことを決定できます。
     </p>
    </dd>
   </dl>
  
   <dl class="qandaentry" id="faq.com.q6">
    <dt><strong>
     
      PHP スクリプトから DLL を作成することはできますか? Perl では
      できるのですが。
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      いいえ、残念ながら PHP にはそのようなツールはありません。
     </p>
    </dd>
   </dl>
  
   <dl class="qandaentry" id="faq.com.q7">
    <dt><strong>
     
      &#039;Unable to obtain IDispatch interface for CLSID
      {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&#039;とはどういう意味ですか?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      このエラーが発生する理由はいくつかあります。
      <ul class="itemizedlist">
       <li class="listitem">
        <span class="simpara">
         CLSID が正しくない
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
         要求された DLL が無い
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
         要求されたコンポーネントが IDispatch インターフェイスを実装していない
        </span>
       </li>
      </ul>
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q8">
    <dt><strong>
     
      COM オブジェクトをリモートサーバーから実行するにはどうすればよいですか?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      ローカルオブジェクトを実行するのと全く同様です。ただ、COM
      コンストラクタの 2 番目のパラメータにリモートマシンの IP アドレスを
      渡すだけです。
     </p>
     <p class="para">
      <var class="filename">php.ini</var> に
      <a href="com.configuration.php#ini.com.allow-dcom" class="link">com.allow_dcom</a><code class="literal">=</code><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>
      をセットするのを忘れないでください。
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q9">
    <dt><strong>
     
      &#039;DCOM is disabled in C:\path...\scriptname.php on line 6&#039; という
      エラーが発生しました。どうすればよいですか？
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      <var class="filename">php.ini</var> を編集して
      <a href="com.configuration.php#ini.com.allow-dcom" class="link">com.allow_dcom</a><code class="literal">=</code><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>.
      としてください。
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q10">
    <dt><strong>
     
      PHP を使用したページで ActiveX オブジェクトをロード/操作することは
      できますか?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      これは PHP とは関係ありません。ActiveX オブジェクトは、HTML
      ドキュメントから要求があった場合にクライアント側でロードされます。
      PHP スクリプトとは関係が無く、従ってサーバー側と直接やりとりすることも
      できません。
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q11">
    <dt><strong>
     
      実行中のコンポーネントのインスタンスを取得することはできますか?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      モニカーを使用すれば可能です。同じ Word インスタンスに対して複数の
      参照を取得したい場合は、以下のようにしてインスタンスを生成します。
     </p>
     <div class="example-contents">
<div class="cdata"><pre>
&lt;?php
$word = new COM(&quot;C:\docs\word.doc&quot;);
?&gt;
</pre></div>
     </div>

     <p class="para">
      こうすれば、実行中のインスタンスが無い、もしくはインスタンスの
      取得が不可能だった場合には新規に生成され、インスタンスが取得できた
      場合にはそのハンドルを返します。
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q12">
    <dt><strong>
     
      COM オブジェクトから送られてくるイベントを扱う方法はありますか？
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      イベントシンクを定義し、<span class="function"><a href="function.com-event-sink.php" class="function">com_event_sink()</a></span>
      を使用してそれをバインドすることが可能です。PHP でイベントシンククラスの
      雛形を作成するために <span class="function"><a href="function.com-print-typeinfo.php" class="function">com_print_typeinfo()</a></span> を
      使用することが可能です。
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q13">
    <dt><strong>
     
      2 つ以上のインターフェイスを公開している COM オブジェクトのメソッドを
      呼び出そうとして困っています。どうすればよいですか?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      この問題に対する答えは、簡単ですが残念なものです。正確には
      わかりませんが、おそらく打つ手はありません。
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q14">
    <dt><strong>
     
      PHP は COM を扱えるということは分かりました。では COM+ については
      どうですか?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      COM+ とは MTS(Microsoft Transaction Server) と MSMQ(Microsfot
      Message Queue Service) を通じてコンポーネントを操作する
      フレームワークによって COM を拡張したものです。が、PHP がそういった
      コンポーネントをサポートするにあたって特別に必要なことはありません。
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q15">
    <dt><strong>
     
      PHP が COM オブジェクトを操作することができるということは、MTS を
      使ってコンポーネントリソースを扱えると考えてもよいということですか？
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHP それ自体はまだトランザクションをサポートしていません。従って
      エラーが発生してもロールバック処理は行われません。もし
      トランザクションをサポートするコンポーネントを使用する場合は、
      自分でトランザクション処理を実装する必要があります。
     </p>
    </dd>
   </dl>
 
  
 </div>
<?php manual_footer($setup); ?>