В целях демонстрации нам потребовался действующий компонент на основе модели компонентных объектов 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), если это не было сделано раньше.
Рис. 15 2. Утилита Ildasm.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.