mirror of
https://github.com/php/doc-ru.git
synced 2026-03-26 08:42:13 +01:00
297 lines
11 KiB
XML
297 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 2bb07c8c43f028c665a33bfc08a22639e9e35dc6 Maintainer: shein Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<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 может быть использован для доступа к объектам COM и DCOM на
|
||
платформах Win32.
|
||
</para>
|
||
|
||
<qandaset>
|
||
<qandaentry xml:id="faq.com.q1">
|
||
<question>
|
||
<para>
|
||
Я собрал DLL для кое-каких вычислений. Можно ли запустить эту DLL из PHP?
|
||
</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. Если вы обнаружите неподдерживаемые
|
||
типы, пожалуйста, сообщите о них как об ошибке (если это ещё не сделано)
|
||
и предоставьте всю доступную информацию.
|
||
</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 рассматриваются
|
||
как ресурсы, то они доступны только в контексте одного скрипта.
|
||
</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>
|
||
Можно ли генерировать DLL-файлы из PHP-скриптов так, как это можно делать в 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>
|
||
Точно так же как вы запускаете локальные объекты. Вам только надо передать
|
||
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 здесь не причём. Объекты ActiveX загружаются на стороне клиента,
|
||
если они были запрошены из HTML документа. Связи с PHP-скриптом здесь нет и,
|
||
следовательно, прямое взаимодействие с серверной стороной невозможно.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
<qandaentry xml:id="faq.com.q11">
|
||
<question>
|
||
<para>
|
||
Возможно ли получить выполняющийся экземпляр компонента?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Это возможно с помощью моникеров (monikers). Если вы хотите получить несколько
|
||
ссылок на один и тот же экземпляр 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> вы можете определить
|
||
приёмник события и привязать его. Вы можете заставить PHP сгенерировать
|
||
скелет класса приёмника событий, используя
|
||
<function>com_print_typeinfo</function>.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q13">
|
||
<question>
|
||
<para>
|
||
У меня возникают проблемы при попытке вызвать метод объекта COM,
|
||
который предоставляет более чем один интерфейс. Что я могу сделать?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
Ответ так же прост, как и неудовлетворителен. Не знаю точно, но думаю,
|
||
что вы не можете ничего сделать. Если у кого-то есть точная
|
||
информация по этому вопросу, пожалуйста, дайте
|
||
<link xlink:href="mailto:&email.harald;">мне</link> знать :)
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q14">
|
||
<question>
|
||
<para>
|
||
Значит PHP работает с COM, как насчёт COM+?
|
||
</para>
|
||
</question>
|
||
<answer>
|
||
<para>
|
||
COM+ расширяет COM, предоставляя систему для управления компонентами
|
||
через MTS и MSMQ, но здесь нет ничего особенного, что PHP должен
|
||
поддерживать для использования таких компонент.
|
||
</para>
|
||
</answer>
|
||
</qandaentry>
|
||
|
||
<qandaentry xml:id="faq.com.q15">
|
||
<question>
|
||
<para>
|
||
Если PHP может манипулировать COM-объектами, можно ли представить себе
|
||
использование MTS для управления ресурсами компонентов
|
||
в соединении с PHP?
|
||
</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
|
||
-->
|