-
Notifications
You must be signed in to change notification settings - Fork 109
Expand file tree
/
Copy pathcom.xml
More file actions
executable file
·193 lines (185 loc) · 7.45 KB
/
Copy pathcom.xml
File metadata and controls
executable file
·193 lines (185 loc) · 7.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: e0352653179c355a6b9c353629147b06a2069f24 Maintainer: mowangjuanzi Status: ready -->
<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 中运行这个 DLL 吗?</para>
</question>
<answer>
<para>如果这是个简单的 DLL 那么还没有办法在 PHP 中运行它。如果这个 DLL 中包含有一个 COM 服务器并且它实现了 IDispatch 接口,那有可能访问它。</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q2">
<question>
<para>“Unsupported variant type: xxxx (0xxxxx)”是什么意思?</para>
</question>
<answer>
<para>有几十种 VARIANT 类型以及它们的组合。大多数已经被支持了但还有几种尚未实现。数组没有完全被支持。只有一维的仅用作索引的数组可以在 PHP 和 COM 之间传递。如果你发现其它未支持的类型,请当作一个 bug 报告(如果尚未被报告的话)并提供尽可能多的信息。</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q3">
<question>
<para>在 PHP 中有可能操纵可视对象吗?</para>
</question>
<answer>
<para>一般来说是可以的,但是 PHP 大都用来作为 web 脚本语言并运行在 web 服务器的上下文环境中,因此可视对象决不会在服务器的桌面上显示。如果你把 PHP 用作应用程序脚本例如结合 PHP-GTK 来使用,那么访问和通过 COM 来操纵可视对象方面没有限制。</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q4">
<question>
<para>可以将一个 COM 对象保存在 session 中吗?</para>
</question>
<answer>
<para>不行。COM 的实例被看作是资源,因此只在一个脚本的上下文中有效。</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>我能像在 Perl 中一样从 PHP 脚本生成 DLL 文件吗?</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>完全和运行本地对象一样。只须将远端服务器的 IP 作为第二个变量传递给 COM 的构造函数即可。</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 的事。如果在 HTML 文档中请求的话,ActiveX 对象被加载在客户端。这和 PHP 脚本没有关系,因此也不可能和服务器端发生直接的交互作用。</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q11">
<question>
<para>有可能得到一个组件在运行中的实例吗?</para>
</question>
<answer>
<para>在绰号的帮助下这有可能。如果你想得到同一个 word 实例的多个引用你可以这样建立此实例:</para>
<programlisting role="php">
<![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>函数绑定之。可以用
<function>com_print_typeinfo</function>来让 PHP 产生事件收报方类的框架。</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q13">
<question>
<para>
我在尝试调用一个打开了多于一个接口的 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 和 MSMQ 来管理组件的框架扩展了 COM,但并没有什么特殊之处使 PHP 非要支持这样的组件。</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q15">
<question>
<para>如果 PHP 可以操纵 COM 对象,那么可以设想结合 PHP 用 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
-->