Sophie

Sophie

distrib > Mandriva > 2008.1 > x86_64 > by-pkgid > 05cd670d8a02b2b4a0ffb1756f2e8308 > files > 5345

php-manual-zh-5.2.4-1mdv2008.1.noarch.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>PHP 和 COM</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="PHP 手册"
HREF="index.html"><LINK
REL="UP"
TITLE="FAQ:常见问题"
HREF="faq.html"><LINK
REL="PREVIOUS"
TITLE="PHP 和 HTML"
HREF="faq.html.html"><LINK
REL="NEXT"
TITLE="PHP 和其它语言"
HREF="faq.languages.html"><META
HTTP-EQUIV="Content-type"
CONTENT="text/html; charset=UTF-8"></HEAD
><BODY
CLASS="chapter"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>PHP 手册</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="faq.html.html"
ACCESSKEY="P"
>上一页</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="faq.languages.html"
ACCESSKEY="N"
>下一页</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="chapter"
><H1
><A
NAME="faq.com"
>章 57. PHP 和 COM</A
></H1
><P
>&#13;    PHP 可以在 Win32 平台中访问 COM 和 DCOM 对象。
   </P
><DIV
CLASS="qandaset"
><DL
><DT
>1. <A
HREF="faq.com.html#faq.com.q1"
>&#13;      我建立了一个 DLL 来做某种计算。有办法在 PHP 中运行这个 DLL 吗?
     </A
></DT
><DT
>2. <A
HREF="faq.com.html#faq.com.q2"
>&#13;      “Unsupported variant type: xxxx (0xxxxx)”是什么意思?
     </A
></DT
><DT
>3. <A
HREF="faq.com.html#faq.com.q3"
>&#13;      在 PHP 中有可能操纵可视对象吗?
     </A
></DT
><DT
>4. <A
HREF="faq.com.html#faq.com.q4"
>&#13;      可以将一个 COM 对象保存在 session 中吗?
     </A
></DT
><DT
>5. <A
HREF="faq.com.html#faq.com.q5"
>&#13;      怎样可以捕获 COM 的错误?
     </A
></DT
><DT
>6. <A
HREF="faq.com.html#faq.com.q6"
>&#13;      我能像在 Perl 中一样从 PHP 脚本生成 DLL 文件吗?
     </A
></DT
><DT
>7. <A
HREF="faq.com.html#faq.com.q7"
>&#13;      “Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}”是什么意思?
     </A
></DT
><DT
>8. <A
HREF="faq.com.html#faq.com.q8"
>&#13;      怎样从远端服务器运行 COM 对象?
     </A
></DT
><DT
>9. <A
HREF="faq.com.html#faq.com.q9"
>&#13;      我得到一个“DCOM is disabled in C:\path...\scriptname.php on line 6”信息,应该怎么办?
     </A
></DT
><DT
>10. <A
HREF="faq.com.html#faq.com.q10"
>&#13;      有可能在 PHP 页面中加载/操纵 ActiveX 对象吗?
     </A
></DT
><DT
>11. <A
HREF="faq.com.html#faq.com.q11"
>&#13;      有可能得到一个组件在运行中的实例吗?
     </A
></DT
><DT
>12. <A
HREF="faq.com.html#faq.com.q12"
>&#13;      有办法处理 COM 对象中发送的事件吗?
     </A
></DT
><DT
>13. <A
HREF="faq.com.html#faq.com.q13"
>&#13;      我在尝试调用一个打开了多于一个接口的 COM 对象中的方法时碰到问题,应该怎么办?
     </A
></DT
><DT
>14. <A
HREF="faq.com.html#faq.com.q14"
>&#13;      这么说 PHP 可以和 COM 一起工作,那么 COM+ 呢?
     </A
></DT
><DT
>15. <A
HREF="faq.com.html#faq.com.q15"
>&#13;      如果 PHP 可以操纵 COM 对象,那么可以设想结合 PHP 用 MTS 来管理组件资源吗?
     </A
></DT
></DL
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q1"
></A
><B
>1. </B
>
      我建立了一个 DLL 来做某种计算。有办法在 PHP 中运行这个 DLL 吗?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      如果这是个简单的 DLL 那么还没有办法在 PHP 中运行它。如果这个 DLL 中包含有一个 COM
      服务器并且它实现了 IDispatch 接口,那有可能访问它。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q2"
></A
><B
>2. </B
>
      “Unsupported variant type: xxxx (0xxxxx)”是什么意思?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      有几十种 VARIANT 类型以及它们的组合。大多数已经被支持了但还有几种尚未实现。数组没有完全被支持。只有一维的仅用作索引的数组可以在 PHP 和 COM 之间传递。如果你发现其它未支持的类型,请当作一个 bug 报告(如果尚未被报告的话)并提供尽可能多的信息。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q3"
></A
><B
>3. </B
>
      在 PHP 中有可能操纵可视对象吗?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      一般来说是可以的,但是 PHP 大都用来作为 web 脚本语言并运行在 web
      服务器的上下文环境中,因此可视对象决不会在服务器的桌面上显示。如果你把
      PHP 用作应用程序脚本例如结合 PHP-GTK 来使用,那么访问和通过 COM
      来操纵可视对象方面没有限制。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q4"
></A
><B
>4. </B
>
      可以将一个 COM 对象保存在 session 中吗?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      不行。COM 的实例被看作是资源,因此只在一个脚本的上下文中有效。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q5"
></A
><B
>5. </B
>
      怎样可以捕获 COM 的错误?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      在 PHP 5 中,COM 扩展会发出 <TT
CLASS="literal"
>com_exception</TT
>
      异常信息,可以捕获并检查 <TT
CLASS="literal"
>code</TT
>
      成员来决定下一步的行为。
     </P
><P
>&#13;      在 PHP 4 中除了用 PHP 自己提供的办法之外(@,track_errors,..)不可能捕获 COM 的错误。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q6"
></A
><B
>6. </B
>
      我能像在 Perl 中一样从 PHP 脚本生成 DLL 文件吗?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      不行,PHP 没有这样的工具。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q7"
></A
><B
>7. </B
>
      “Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}”是什么意思?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      此错误可以有多种原因:
      <P
></P
><UL
><LI
><P
>&#13;         错误的 CLSID
         </P
></LI
><LI
><P
>&#13;         找不到所请求的 DLL
         </P
></LI
><LI
><P
>&#13;         所请求的组件没有实现 IDispatch 接口
         </P
></LI
></UL
>
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q8"
></A
><B
>8. </B
>
      怎样从远端服务器运行 COM 对象?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      完全和运行本地对象一样。只须将远端服务器的 IP 作为第二个变量传递给 COM 的构造函数即可。
     </P
><P
>&#13;      确认在 <TT
CLASS="filename"
>php.ini</TT
> 中设定了 <A
HREF="ref.com.html#ini.com.allow-dcom"
><I
CLASS="term"
>&#13;     <CODE
CLASS="parameter"
>com.allow_dcom</CODE
>
    </I
></A
><TT
CLASS="literal"
>=<TT
CLASS="constant"
><B
>TRUE</B
></TT
></TT
>。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q9"
></A
><B
>9. </B
>
      我得到一个“DCOM is disabled in C:\path...\scriptname.php on line 6”信息,应该怎么办?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      编辑 <TT
CLASS="filename"
>php.ini</TT
> 并设定 <A
HREF="ref.com.html#ini.com.allow-dcom"
><I
CLASS="term"
>&#13;     <CODE
CLASS="parameter"
>com.allow_dcom</CODE
>
    </I
></A
><TT
CLASS="literal"
>=<TT
CLASS="constant"
><B
>TRUE</B
></TT
></TT
>。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q10"
></A
><B
>10. </B
>
      有可能在 PHP 页面中加载/操纵 ActiveX 对象吗?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      这不关 PHP 的事。如果在 HTML 文档中请求的话,ActiveX 对象被加载在客户端。这和 PHP
      脚本没有关系,因此也不可能和服务器端发生直接的交互作用。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q11"
></A
><B
>11. </B
>
      有可能得到一个组件在运行中的实例吗?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      在绰号的帮助下这有可能。如果你想得到同一个 word 实例的多个引用你可以这样建立此实例:
     </P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
CELLPADDING="5"
><TR
><TD
><code><font color="#000000">
<font color="#0000BB">&lt;?php<br />$word </font><font color="#007700">= new </font><font color="#0000BB">COM</font><font color="#007700">(</font><font color="#DD0000">"C:\docs\word.doc"</font><font color="#007700">);<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
><P
>&#13;      如果没有运行中的实例这将建立一个新的实例,否则将会返回正在运行中的实例的句柄,如果可用的话。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q12"
></A
><B
>12. </B
>
      有办法处理 COM 对象中发送的事件吗?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      可以自定义事件收报方并且用 <A
HREF="function.com-event-sink.html"
><B
CLASS="function"
>com_event_sink()</B
></A
>
      函数绑定之。可以用 <A
HREF="function.com-print-typeinfo.html"
><B
CLASS="function"
>com_print_typeinfo()</B
></A
>
      来让 PHP 产生事件收报方类的框架。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q13"
></A
><B
>13. </B
>
      我在尝试调用一个打开了多于一个接口的 COM 对象中的方法时碰到问题,应该怎么办?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      我也不知道怎么办,我想这没办法。如果什么人有对此问题的明确信息请<A
HREF="mailto:harald.radi@nme.at"
TARGET="_top"
>告诉我</A
>。:)
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q14"
></A
><B
>14. </B
>
      这么说 PHP 可以和 COM 一起工作,那么 COM+ 呢?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      COM+ 通过使用 MTS 和 MSMQ 来管理组件的框架扩展了 COM,但并没有什么特殊之处使 PHP 非要支持这样的组件。
     </P
></DIV
></DIV
><DIV
CLASS="qandaentry"
><B
><DIV
CLASS="question"
><P
><A
NAME="faq.com.q15"
></A
><B
>15. </B
>
      如果 PHP 可以操纵 COM 对象,那么可以设想结合 PHP 用 MTS 来管理组件资源吗?
     </P
></DIV
></B
><DIV
CLASS="answer"
><P
><B
> </B
>
      PHP 本身还并不处理事务。因而如果出错也不会发动撤回机制。如果你使用了支持事务处理的组件那你不得不自己实现事务管理。
     </P
></DIV
></DIV
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="faq.html.html"
ACCESSKEY="P"
>上一页</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>起始页</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="faq.languages.html"
ACCESSKEY="N"
>下一页</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>PHP 和 HTML</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="faq.html"
ACCESSKEY="U"
>上一级</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>PHP 和其它语言</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>