mirror of
https://github.com/php/doc-ja.git
synced 2026-03-23 22:52:11 +01:00
302 lines
10 KiB
XML
302 lines
10 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: e0352653179c355a6b9c353629147b06a2069f24 Maintainer: hirokawa Status: ready -->
|
|
<!-- CREDITS: takagi -->
|
|
<chapter xml:id="faq.com" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<title>PHP と COM</title>
|
|
<titleabbrev>PHP と COM</titleabbrev>
|
|
|
|
<para>
|
|
PHP は Win32 プラットフォーム上で COM と DCOM オブジェクトに
|
|
アクセスすることができます。
|
|
</para>
|
|
|
|
<qandaset>
|
|
<qandaentry xml:id="faq.com.q1">
|
|
<question>
|
|
<para>
|
|
とある計算を行う DLL を作成しました。これを PHP で実行させる方法は
|
|
ありますか?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
もしそれが普通の DLL なら、現在のところ PHP からそれを実行する手段は
|
|
ありません。DLL が COM サーバーを含んでいて IDispatch インターフェイスが
|
|
実装されている場合、PHP からアクセスすることができます。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q2">
|
|
<question>
|
|
<para>
|
|
'Unsupported variant type: xxxx (0xxxxx)'とはどういう意味ですか?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
多くの VARIANT タイプとその組み合わせがあり、そのほとんどは
|
|
サポートされていますが、残りのいくつかは未だ実装されていません。
|
|
また配列も完全にサポートされているわけではなく、PHP と COM の間で
|
|
受け渡しが可能なのは 1 次元の添字付配列のみです。もしこの他に
|
|
サポートされていないタイプを見つけた場合は(既知でなければ)、
|
|
できる限りの情報を添えてバグとして報告してください。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q3">
|
|
<question>
|
|
<para>PHP でビジュアルオブジェクトを操作できますか?</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
基本的には可能です。しかし PHP はほとんどの場合ウェブスクリプティングの
|
|
言語として使用されウェブサーバー上で実行されるため、ビジュアルオブジェクトが
|
|
サーバーのデスクトップに現れることはありません。もし PHP を
|
|
アプリケーション作成に使用する、すなわち PHP-GTK と合わせて
|
|
使用する場合にはアクセスに制限はありません。COM を通じて
|
|
ビジュアルオブジェクトを操作することができます。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q4">
|
|
<question>
|
|
<para>COM オブジェクトをセッション情報として保存できますか?</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
できません。COM インスタンスはリソースとして扱われるため、1 つの
|
|
スクリプトを実行している間のみ使用可能です。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q5">
|
|
<question>
|
|
<para>COM の出力するエラーをトラップできますか?</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
COM 拡張モジュールは <literal>com_exception</literal>
|
|
例外をスローします。これをキャッチし、<literal>code</literal>
|
|
メンバを調べることで次にすべきことを決定できます。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q6">
|
|
<question>
|
|
<para>
|
|
PHP スクリプトから DLL を作成することはできますか? Perl では
|
|
できるのですが。
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
いいえ、残念ながら PHP にはそのようなツールはありません。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q7">
|
|
<question>
|
|
<para>
|
|
'Unable to obtain IDispatch interface for CLSID
|
|
{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}'とはどういう意味ですか?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
このエラーが発生する理由はいくつかあります。
|
|
<itemizedlist>
|
|
<listitem>
|
|
<simpara>
|
|
CLSID が正しくない
|
|
</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>
|
|
要求された DLL が無い
|
|
</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>
|
|
要求されたコンポーネントが IDispatch インターフェイスを実装していない
|
|
</simpara>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q8">
|
|
<question>
|
|
<para>
|
|
COM オブジェクトをリモートサーバーから実行するにはどうすればよいですか?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
ローカルオブジェクトを実行するのと全く同様です。ただ、COM
|
|
コンストラクタの 2 番目のパラメータにリモートマシンの IP アドレスを
|
|
渡すだけです。
|
|
</para>
|
|
<para>
|
|
&php.ini; に
|
|
<link linkend="ini.com.allow-dcom">com.allow_dcom</link><literal>=</literal>&true;
|
|
をセットするのを忘れないでください。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q9">
|
|
<question>
|
|
<para>
|
|
'DCOM is disabled in C:\path...\scriptname.php on line 6' という
|
|
エラーが発生しました。どうすればよいですか?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
&php.ini; を編集して
|
|
<link linkend="ini.com.allow-dcom">com.allow_dcom</link><literal>=</literal>&true;.
|
|
としてください。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q10">
|
|
<question>
|
|
<para>
|
|
PHP を使用したページで ActiveX オブジェクトをロード/操作することは
|
|
できますか?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
これは PHP とは関係ありません。ActiveX オブジェクトは、HTML
|
|
ドキュメントから要求があった場合にクライアント側でロードされます。
|
|
PHP スクリプトとは関係が無く、従ってサーバー側と直接やりとりすることも
|
|
できません。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q11">
|
|
<question>
|
|
<para>
|
|
実行中のコンポーネントのインスタンスを取得することはできますか?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
モニカーを使用すれば可能です。同じ Word インスタンスに対して複数の
|
|
参照を取得したい場合は、以下のようにしてインスタンスを生成します。
|
|
</para>
|
|
<programlisting>
|
|
<![CDATA[
|
|
<?php
|
|
$word = new COM("C:\docs\word.doc");
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<para>
|
|
こうすれば、実行中のインスタンスが無い、もしくはインスタンスの
|
|
取得が不可能だった場合には新規に生成され、インスタンスが取得できた
|
|
場合にはそのハンドルを返します。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q12">
|
|
<question>
|
|
<para>
|
|
COM オブジェクトから送られてくるイベントを扱う方法はありますか?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
イベントシンクを定義し、<function>com_event_sink</function>
|
|
を使用してそれをバインドすることが可能です。PHP でイベントシンククラスの
|
|
雛形を作成するために <function>com_print_typeinfo</function> を
|
|
使用することが可能です。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q13">
|
|
<question>
|
|
<para>
|
|
2 つ以上のインターフェイスを公開している COM オブジェクトのメソッドを
|
|
呼び出そうとして困っています。どうすればよいですか?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
この問題に対する答えは、簡単ですが残念なものです。正確には
|
|
わかりませんが、おそらく打つ手はありません。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q14">
|
|
<question>
|
|
<para>
|
|
PHP は COM を扱えるということは分かりました。では COM+ については
|
|
どうですか?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
COM+ とは MTS(Microsoft Transaction Server) と MSMQ(Microsfot
|
|
Message Queue Service) を通じてコンポーネントを操作する
|
|
フレームワークによって COM を拡張したものです。が、PHP がそういった
|
|
コンポーネントをサポートするにあたって特別に必要なことはありません。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
<qandaentry xml:id="faq.com.q15">
|
|
<question>
|
|
<para>
|
|
PHP が COM オブジェクトを操作することができるということは、MTS を
|
|
使ってコンポーネントリソースを扱えると考えてもよいということですか?
|
|
</para>
|
|
</question>
|
|
<answer>
|
|
<para>
|
|
PHP それ自体はまだトランザクションをサポートしていません。従って
|
|
エラーが発生してもロールバック処理は行われません。もし
|
|
トランザクションをサポートするコンポーネントを使用する場合は、
|
|
自分でトランザクション処理を実装する必要があります。
|
|
</para>
|
|
</answer>
|
|
</qandaentry>
|
|
|
|
</qandaset>
|
|
</chapter>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|