<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/faq.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'uk',
  ),
  'this' => 
  array (
    0 => 'faq.com.php',
    1 => 'PHP і COM',
    2 => 'PHP і COM',
  ),
  'up' => 
  array (
    0 => 'faq.php',
    1 => 'ЧаПи',
  ),
  'prev' => 
  array (
    0 => 'faq.html.php',
    1 => 'PHP та HTML',
  ),
  'next' => 
  array (
    0 => 'faq.misc.php',
    1 => 'Різні питання',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'uk',
    'path' => 'faq/com.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="faq.com" class="chapter">
  <h1 class="title">PHP і COM</h1>

  

   <p class="para">
    PHP можна використати для доступу до об&#039;єктів COM і DCOM на платформах Win32.
   </p>

  <div class="qandaset"><ol class="qandaset_questions"><li><a href="#faq.com.q1">
     
      Я зібрав DLL для обчислень. Яким чином запустити цю DLL в PHP?
     
    </a></li><li><a href="#faq.com.q2">
     
      Що означає &quot;Unsupported variant type: xxxx (0xxxxx)&quot;?
     
    </a></li><li><a href="#faq.com.q3">
     
      Чи можливо керувати візуальними об&#039;єктами в PHP?
     
    </a></li><li><a href="#faq.com.q4">
     
      Чи я можу зберігати об&#039;єкт COM в сесії?
     
    </a></li><li><a href="#faq.com.q5">
     
      Як я можу перехопити помилки COM?
     
    </a></li><li><a href="#faq.com.q6">
     
      Чи я можу генерувати файли DLL скриптами PHP, так як це робив на Perl?
     
    </a></li><li><a href="#faq.com.q7">
     
      Що означає &quot;Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&quot;?
     
    </a></li><li><a href="#faq.com.q8">
     
      Як мені запускати об&#039;єкти COM з віддаленого сервера?
     
    </a></li><li><a href="#faq.com.q9">
     
      Я отримую &quot;DCOM is disabled in C:\path...\scriptname.php on line 6&quot;, що я
      можу зробити?
     
    </a></li><li><a href="#faq.com.q10">
     
      Чи можливо завантажувати/маніпулювати об&#039;єктом ActiveX на сторінці за
      допомогою PHP?
     
    </a></li><li><a href="#faq.com.q11">
     
      Чи можливо отримати запущений екземпляр компонента?
     
    </a></li><li><a href="#faq.com.q12">
     
      Чи є спосіб обробки події, надісланої з об&rsquo;єкта COM?
     
    </a></li><li><a href="#faq.com.q13">
     
      Не можу викликати метод об&#039;єкта COM, який реалізує більше ніж один
      інтерфейс. Що я можу зробити?
     
    </a></li><li><a href="#faq.com.q14">
     
      Отже, PHP працює з COM, як щодо COM+?
     
    </a></li><li><a href="#faq.com.q15">
     
      Якщо PHP може керувати об&#039;єктами COM, чи можемо ми уявити використання MTS
      для керування ресурсами компонентів у поєднанні з PHP?
     
    </a></li></ol></div>
   <dl class="qandaentry" id="faq.com.q1">
    <dt><strong>
     
      Я зібрав DLL для обчислень. Яким чином запустити цю DLL в PHP?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Якщо це звичайна DLL, то її поки що не запустити з PHP. Якщо DLL містить
      COM сервер, ви можете мати доступ до нього, якщо він реалізував
      інтерфейс IDispatch.
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q2">
    <dt><strong>
     
      Що означає &quot;Unsupported variant type: xxxx (0xxxxx)&quot;?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Є десятки типів VARIANT та їхніх комбінацій. Більшість з них вже
      підтримуються, але кілька ще на стадії впровадження. Масиви підтримуються
      не повністю. Тільки одновимірні індексовані масиви можуть передаватися між
      PHP та COM. Якщо ви знайшли інші типи, що не підтримуються, повідомте,
      будь ласка, про них, як про ваду (якщо вже не повідомлено) та надайте
      якнайбільше інформації.
     </p>
    </dd>
   </dl>
  
   <dl class="qandaentry" id="faq.com.q3">
    <dt><strong>
     
      Чи можливо керувати візуальними об&#039;єктами в PHP?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Загалом так, але оскільки PHP є мовою веб-сценаріїв, її код
      запускається в контексті вебсервера, тому візуальні об&#039;єкти ніколи не
      з&#039;являться на робочому столі серверів. Якщо ви, наприклад, використовуєте
      PHP для написання програм спільно з PHP-GTK, то нема обмежень доступу або
      керування візуальними об&#039;єктами через COM.
     </p>
    </dd>
   </dl>
  
   <dl class="qandaentry" id="faq.com.q4">
    <dt><strong>
     
      Чи я можу зберігати об&#039;єкт COM в сесії?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Ні, не можете. Екземпляри COM розглядаються як ресурси, тому вони доступні
      лише в контексті одного сеансу.
     </p>
    </dd>
   </dl>
  
   <dl class="qandaentry" id="faq.com.q5">
    <dt><strong>
     
      Як я можу перехопити помилки COM?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Розширення COM викидає виключення <code class="literal">com_exception</code>, які
      ви можете ловити, щоб визначити і оглянути проблемну частину
      <code class="literal">коду</code>.
     </p>
    </dd>
   </dl>
  
   <dl class="qandaentry" id="faq.com.q6">
    <dt><strong>
     
      Чи я можу генерувати файли DLL скриптами PHP, так як це робив на Perl?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Ні, на жаль на PHP такий інструмент недоступний.
     </p>
    </dd>
   </dl>
  
   <dl class="qandaentry" id="faq.com.q7">
    <dt><strong>
     
      Що означає &quot;Unable to obtain IDispatch interface for CLSID {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}&quot;?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Ця помилка може бути з декількох причин:
      <ul class="itemizedlist">
       <li class="listitem">
         <span class="simpara">
         неправильний CLSID
         </span>
        </li>
       <li class="listitem">
         <span class="simpara">
         необхідна DLL відсутня
         </span>
        </li>
       <li class="listitem">
         <span class="simpara">
         запитуваний компонент не реалізує інтерфейс IDispatch
         </span>
        </li>
       </ul>
     </p>
    </dd>
   </dl>
    
   <dl class="qandaentry" id="faq.com.q8">
    <dt><strong>
     
      Як мені запускати об&#039;єкти COM з віддаленого сервера?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Так само, як і локальні об&#039;єкти. Вам лише треба передати другим параметром
      конструктору COM IP віддаленої машини.
     </p>
     <p class="para">
      Переконайтеся, що ви визначили
      <a href="com.configuration.php#ini.com.allow-dcom" class="link">com.allow_dcom</a><code class="literal">=</code><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>
      у вашому <var class="filename">php.ini</var>.
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q9">
    <dt><strong>
     
      Я отримую &quot;DCOM is disabled in C:\path...\scriptname.php on line 6&quot;, що я
      можу зробити?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Відредагуйте ваш <var class="filename">php.ini</var>, задавши
      <a href="com.configuration.php#ini.com.allow-dcom" class="link">com.allow_dcom</a><code class="literal">=</code><strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>.
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q10">
    <dt><strong>
     
      Чи можливо завантажувати/маніпулювати об&#039;єктом ActiveX на сторінці за
      допомогою PHP?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Це не має нічого спільного з PHP. Об&#039;єкти ActiveX завантажуються у
      клієнтський код за запитом документа HTML. Це не стосується скрипту PHP,
      тому пряма взаємодія на стороні сервера неможлива.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.com.q11">
    <dt><strong>
     
      Чи можливо отримати запущений екземпляр компонента?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Це можливо завдяки псевдонімам. Якщо треба отримати численні посилання на
      той самий екземпляр слова, ви можете створити цей екземпляр, як показано:
     </p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$word </span><span style="color: #007700">= new </span><span style="color: #0000BB">COM</span><span style="color: #007700">(</span><span style="color: #DD0000">"C:\docs\word.doc"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

     <p class="para">
      Це створить новий екземпляр, якщо запущеного немає, або поверне дескриптор
      запущеного екземпляра, якщо він доступний.
     </p>
    </dd>
   </dl>
   <dl class="qandaentry" id="faq.com.q12">
    <dt><strong>
     
      Чи є спосіб обробки події, надісланої з об’єкта COM?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Ви можете створити обробник подій і прив&#039;язати його, використавши
      <span class="function"><a href="function.com-event-sink.php" class="function">com_event_sink()</a></span>. Щоб PHP генерував скелет для класу
      приймача подій, є функція <span class="function"><a href="function.com-print-typeinfo.php" class="function">com_print_typeinfo()</a></span>.
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q13">
    <dt><strong>
     
      Не можу викликати метод об&#039;єкта COM, який реалізує більше ніж один
      інтерфейс. Що я можу зробити?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      Відповідь настільки проста, наскільки і незадовільна. Невідомо, чому так,
      але не можна нічого з цим вдіяти.
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q14">
    <dt><strong>
     
      Отже, PHP працює з COM, як щодо COM+?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      COM+ розширює COM платформою для керування компонентами через MTS і MSMQ,
      але в цьому немає нічого особливого, аби PHP мав підтримку цього продукту.
     </p>
    </dd>
   </dl>
   
   <dl class="qandaentry" id="faq.com.q15">
    <dt><strong>
     
      Якщо PHP може керувати об&#039;єктами COM, чи можемо ми уявити використання MTS
      для керування ресурсами компонентів у поєднанні з PHP?
     
    </strong></dt>
    <dd class="answer">
     <p class="para">
      PHP сам ще не обробляє транзакції. Таким чином, якщо виникає помилка,
      відкочування не починається. Якщо ви використовуєте компоненти, які
      підтримують транзакції, вам треба власноруч реалізувати управління
      транзакціями.
     </p>
    </dd>
   </dl>
 
  
 </div>
<?php manual_footer($setup); ?>