Иллюстрированный самоучитель по Architecture .NET

Унаследованный компонент на основе модели компонентных объектов Microsoft (COM)

В целях демонстрации нам потребовался действующий компонент на основе модели компонентных объектов Microsoft (COM), который и будет описан в этом разделе. Заметьте, что IDL-файл LegacyCOMServer был создан как часть проекта динамически подключаемой библиотеки VC++ 6.0 (ATL СОМ AppWizard DLL). Этот проект содержит сгенерированный Мастером создания объектов на основе библиотеки шаблонных классов ATL (ATL Object Wizard) объект LegacyCOMObj, содержащий один дуальный интерфейс без агрегирования. Этот дуальный интерфейс имеет один метод с именем AddEmUp, который принимает два входных параметра целого типа с именами i и j и один выходной параметр типа int* с именем psum.

Как создать и использовать упаковщик, вызываемый во время выполнения (Runtime Callable Wrapper, RCW)

  1. Имея файл динамически подключаемой библиотеки (DLL) – сервер, построенный на основе модели компонентных объектов Microsoft (COM), или TLB-файл, с помощью Tlbimp.exe создайте упаковщик, вызываемый во время выполнения (Runtime Callable Wrapper, RCW). Этот упаковщик позволит получить доступ из управляемого клиентского кода к компонентам на основе модели компонентных объектов Microsoft (COM).
  2. С помощью Regsvr32.exe зарегистрируйте на своей машине динамически подключаемую библиотеку (DLL) сервера на основе модели компонентных объектов Microsoft (COM), если это не было сделано раньше.
  3. При желании, добавьте оператор использования пространства имен в клиентскую управляемую программу на C++, чтобы можно было обращаться к классу на основе модели компонентных объектов Microsoft (COM) по его короткому имени. Это пространство имен можно найти с помощью Oleview.exe – нужно поискать имя библиотеки на сервере. Несомненно, следует также добавить в клиентскую программу фрагмент, который объявляет и вызывает методы компонента на основе модели компонентных объектов Microsoft (COM). Пример такого фрагмента мы рассмотрим немного позже.
  4. Инсталлируйте сборку LegacyCOMServer.dll, если вы еще этого не сделали. Проще всего с этой целью скопировать файл LegacyCOMServer.dll в папку управляемого клиента. Теперь клиентская программа может быть скомпилирована и запущена для проверки правильности работы упаковщика, вызываемого во время выполнения (Runtime Callable Wrapper, RCW).

Если вы хотите создать проект ATL СОМ самостоятельно, но у вас нет Visual Studio 6.0, создайте новый проект на основе библиотеки шаблонных классов ATL в Visual, Studio.NET. Однако в этом случае вы обнаружите, что сгенерированный код пусковой системы радикально отличается от приведенного в нашем примере кода, который был получен с помощью Visual Studio 6.0. Например, не существует файла IDL, а вместо этого используется ключевое слово _interface (интерфейс) для определения интерфейса ILegacyCOMObj непосредственно в файле LegacyCOMObj.h.

Кроме того, Visual C++.NET в сгенерированном коде существенно использует атрибуты, и поэтому такой код даже по виду отличается от кода на обычном Visual C++. Однако, в целях обучения использованию Tlbimp.exe для компонентов на основе модели компонентных объектов Microsoft (COM), все это не имеет существенного значения.

import "oaidl.idl"; // импорт
import "ocidl.idl"; // импорт
[
object, // объект
uuid(7C82D19B-2B04-476B-AEC8-OABFD7A2E54B), dual, // двойной
helpstring("ILegacyCOMOb] Interface"), // Интерфейс
pointer_default(unique) // уникальный
]
interface ILegacyCOMOb]: IDispatch // интерфейс
{
[id(l), helpstring("method AddEmUp")] // идентификатор,
// метод
HRESULT AddEmUp([in] int i, [in] int ],
[out, retval] int *psum); }; [
uuid(5FBA2BCl-CD8B-4B20-AF94-4CA17714C9CO),
version(1.0), // версия
helpstring("LegacyCOMServer 1.0 Type Library") // Библиотека
// типов ] library LEGACYCOMSERVERLib // библиотека
{
importlib("stdole32.tlb"); importlib("stdole2.tlb");
[
uuid(EBAC6FDO-D55B-4BA6-B386-8B774255A87C),
helpstring("LegacyCOMObj Class") // Класс
]
coclass LegacyCOMObj
{
[default] interface ILegacyCOMObj;
// [заданный по умолчанию] интерфейс ILegacyCOMObj;
};
};

Вышеприведенный файл IDL является частью такого же проекта на основе библиотеки шаблонных классов ATL LegacyCOMServer, который содержит следующий код реализации для открытого метода AddEmUp интерфейса на основе модели компонентных объектов Microsoft (COM):

STDMETHODIMP CLegacyCOMObj::AddEmUp(int i, int j, int *psum)
{
// TODO: Add your implementation code here
// TODO: Добавьте ваш код реализации здесь
*psum = i + j;
return S_OK;
}

Когда построен вышеуказанный проект сервера на основе модели компонентных объектов Microsoft (COM), системный реестр будет автоматически обновлен на одном из шагов построения. Однако если вы инсталлируете проект сервера на другой машине, то там тоже придется его зарегистрировать. Это может быть выполнено из командной строки следующим образом:

Regsvr32 LegacyCOMServer.dll

Рабочая версия этой динамически подключаемой библиотеки (DLL), не зависящая от библиотеки шаблонных классов ATL во время выполнения, прилагается. Вы можете ее зарегистрировать при помощи пакетного файла reg.bat и отменить регистрацию посредством unreg.bat.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.