<!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 > PHP 可以在 Win32 平台中访问 COM 和 DCOM 对象。 </P ><DIV CLASS="qandaset" ><DL ><DT >1. <A HREF="faq.com.html#faq.com.q1" > 我建立了一个 DLL 来做某种计算。有办法在 PHP 中运行这个 DLL 吗? </A ></DT ><DT >2. <A HREF="faq.com.html#faq.com.q2" > “Unsupported variant type: xxxx (0xxxxx)”是什么意思? </A ></DT ><DT >3. <A HREF="faq.com.html#faq.com.q3" > 在 PHP 中有可能操纵可视对象吗? </A ></DT ><DT >4. <A HREF="faq.com.html#faq.com.q4" > 可以将一个 COM 对象保存在 session 中吗? </A ></DT ><DT >5. <A HREF="faq.com.html#faq.com.q5" > 怎样可以捕获 COM 的错误? </A ></DT ><DT >6. <A HREF="faq.com.html#faq.com.q6" > 我能像在 Perl 中一样从 PHP 脚本生成 DLL 文件吗? </A ></DT ><DT >7. <A HREF="faq.com.html#faq.com.q7" > “Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}”是什么意思? </A ></DT ><DT >8. <A HREF="faq.com.html#faq.com.q8" > 怎样从远端服务器运行 COM 对象? </A ></DT ><DT >9. <A HREF="faq.com.html#faq.com.q9" > 我得到一个“DCOM is disabled in C:\path...\scriptname.php on line 6”信息,应该怎么办? </A ></DT ><DT >10. <A HREF="faq.com.html#faq.com.q10" > 有可能在 PHP 页面中加载/操纵 ActiveX 对象吗? </A ></DT ><DT >11. <A HREF="faq.com.html#faq.com.q11" > 有可能得到一个组件在运行中的实例吗? </A ></DT ><DT >12. <A HREF="faq.com.html#faq.com.q12" > 有办法处理 COM 对象中发送的事件吗? </A ></DT ><DT >13. <A HREF="faq.com.html#faq.com.q13" > 我在尝试调用一个打开了多于一个接口的 COM 对象中的方法时碰到问题,应该怎么办? </A ></DT ><DT >14. <A HREF="faq.com.html#faq.com.q14" > 这么说 PHP 可以和 COM 一起工作,那么 COM+ 呢? </A ></DT ><DT >15. <A HREF="faq.com.html#faq.com.q15" > 如果 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 > 在 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 > 错误的 CLSID </P ></LI ><LI ><P > 找不到所请求的 DLL </P ></LI ><LI ><P > 所请求的组件没有实现 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 > 确认在 <TT CLASS="filename" >php.ini</TT > 中设定了 <A HREF="ref.com.html#ini.com.allow-dcom" ><I CLASS="term" > <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" > <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"><?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">?></font> </font> </code></TD ></TR ></TABLE ><P > 如果没有运行中的实例这将建立一个新的实例,否则将会返回正在运行中的实例的句柄,如果可用的话。 </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 >