Вклад Блог Досуг

Регистрируем свой COM-объект

Что такое COM-объект

COM (Component Object Model — объектная модель компонентов; произносится как [ком]) — это технологический стандарт от компании Microsoft, предназначенный для создания программного обеспечения на основе взаимодействующих компонентов, каждый из которых может использоваться во многих программах одновременно. Стандарт воплощает в себе идеи полиморфизма и инкапсуляции объектно-ориентированного программирования. Стандарт COM мог бы быть универсальным и платформо-независимым, но закрепился в основном на операционных системах семейства Microsoft Windows. В современных версиях Windows COM используется очень широко. На основе COM были реализованы технологии: Microsoft OLE Automation, ActiveX, DCOM, COM+, DirectX, а также XPCOM. (Википедия)

Регистрация и использование в PHP

Шаг 0. Проверяем, что COM-объекты в принципе работают

Предполагается, что dll-ка с COM-объектом уже скомпилирована, и осталось разместить её в производственной среде. Чтобы использовать библиотеки с COM-доступом, а также .NET-библиотеки, требуется подключить модуль php_com_dotnet.dll.

Для работы COM-объектов требуются соответствующие права у пользователя, из-под которого запускается пул приложений. Чтобы настроить права:
  1. Запускаем оснастку «Службы компонентов» (Component Services), проходим по цепочке Службы компонентов / Компьютеры / Мой компьютер.
  2. На «Мой компьютер» кликаем правой кнопкой мыши, выбираем «Свойства» (Properties).
  3. На вкладке «Безопасность COM» (COM Security) в пунктах «Права доступа» (Access Permissions) и «Разрешения на запуск и активацию» (Launch and Activation Permissions) выбираем по очереди «Изменить умолчания…» (Edit Defaults…).
  4. В появившемся окне добавляем пользователя IIS с правом на «Локальный доступ» (Local Access), «Локальный запуск» (Local Launch) и «Локальную активацию» (Local Activation).

Этих действий должно хватить на запуск COM-объектов. Проверить можно, попытавшись создать объект Word:
$com = new COM('Word.Application');
Не упало? Поздравляю, всё настроено корректно! (Данный объект, как и любой другой объект из Microsoft Office доступен только при установленном пакете MS Office на сервере).

Шаг 1. Кидаем dll-ку в C:\WINDOWS\system32

Можно закинуть её и в другую папку, однако без дополнительных действий php не будет её видеть. Попытка создать экземпляр COM-объекта в таком случае обернётся исключением Access denied. Скорее всего, на папку с dll-кой также требуются права для пользователя IIS.

Для нормальной работы ваших библиотек с COM-объектами в 64-битных ОС, размещать их нужно как в C:\WINDOWS\system32, так и в C:\WINDOWS\SysWOW64. После этого объект необходимо зарегистрировать с помощью 32-битного RegAsm, иначе PHP не сможет его найти и вы получите ошибку «Класс не обнаружен».

Шаг 2. Регистрируем с помощью RegAsm

Потребуется, конечно, чтобы на машине стоял .Net нужной версии и разрядности. В комплекте поставляется несколько полезных утилит, в том числе и RegAsm (регистратор ассембли, что нам и нужно). Искать утилиту нужно в папке C:\WINDOWS\Microsoft.NET\Framework (либо Framework64, для 64-битных), в папке с номером версии .Net. Например,
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe
Осталось открыть командную строку и написать что-то вроде
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase C:\WINDOWS\system32\MyLittleComy.dll
Параметр /codebase необходим, если ассембли не планируется регистрировать в Global Assemby Cache самостоятельно. Насколько я понял, для библиотек с флагом ComVisible это и невозможно сделать.

В случае успеха появится сообщение, подобное этому:
Microsoft (R) .NET Framework Assembly Registration Utility 4.0.30319.1
Copyright (C) Microsoft Corporation 1998-2004.  All rights reserved.

Types registered successfully
После этого вызов какого-нибудь
$com = new COM('MyLittleComy.SomeNeatMethod');
должен отработать без ошибок.