1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-26 08:42:13 +01:00
Files
archived-doc-ru/faq/com.xml
Sergey Panteleev daef8df962 Обнуление тега Reviewed (#364)
[skip-lint]
[skip-spellcheck]
2021-11-16 13:03:53 +03:00

297 lines
11 KiB
XML
Raw 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: 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
-->