1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-23 23:32:16 +01:00
Files
archived-doc-ru/faq/com.xml

293 lines
11 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: e0352653179c355a6b9c353629147b06a2069f24 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>
На платформах Win32 языком PHP пользуются для доступа к COM- и DCOM-объектам.
</para>
<qandaset>
<qandaentry xml:id="faq.com.q1">
<question>
<para>
Я собрал DLL-библиотеку для вычислений. Каким способом запустить DLL-файл под PHP?
</para>
</question>
<answer>
<para>
PHP пока не умеет запускать просто DLL-библиотеки,
но если 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 уже поддерживает, но отдельные варианты в языке по-прежнему не реализовали.
Массивы поддерживаются не на 100 %. Между PHP и COM разрешается передавать
только одномерные индексные массивы. Пожалуйста, сообщите о других типах как об ошибке,
если не сделали это раньше, если обнаружите типы, которые PHP не поддерживает,
и дайте как можно больше информации.
</para>
</answer>
</qandaentry>
<qandaentry xml:id="faq.com.q3">
<question>
<para>
Возможно ли манипулирование визуальными объектами в PHP?
</para>
</question>
<answer>
<para>
Да, PHP умеет манипулировать визуальными объектами, но поскольку PHP чаще работает
как язык веб-скриптов и запускается в контексте веб-сервера, визуальные объекты
не появятся на рабочем столе сервера. Доступ и манипулирование визуальными объектами
через COM не ограничиваются, когда на PHP пишут приложения,
например, в связке с модулем PHP-GTK.
</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>
Убедитесь, что включили директиву
<link linkend="ini.com.allow-dcom">com.allow_dcom</link><literal>=</literal>&true; в файле &php.ini;
</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>
Ответ настолько же простой, насколько и неудовлетворительный.
Точно не известно, но, скорее всего, ничего сделать невозможно.
</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
-->