ObjectARX, AutoCAD. Среда программирования библиотеки C++

       

Создание Объекта COM


API Автоматизации ответствен за создание соответствующего объекта COM для данного объекта резидента базы. AutoCAD осуществляет набор интерфейсов для всех объектов резидента базы данных с соответствующими компонентами Автоматизации.

Многие из этих интерфейсов будут осуществлены автоматически для ваш AcDbObject-получаемый или AcDbEntity полученный класс, когда Вы используете ATL-ОСНОВАННЫЕ обеспеченные шаблоны.

При создании расширений{*продлений*} к API Автоматизации, Вы могут были должны создать объект COM для данного указателя AcDbObjectId или AcDbObject. Это может быть сделано, используя CoCreateInstance сопровождаемый при помощи AcAxOleLinkManager и IACADBASEOBJECT, чтобы основать соответствующие связи. Следующие функции экспортируются для этой цели:

// Получить IUNKNOWN

существующего объекта COM (или недавно созданный объект COM,

// если не существуете) который представляет AcDbObject, пропускал{*прошел*} в.

//

HRESULT

AcAxGetIUnknownOfObject(LPUNKNOWN* ppUnk, AcDbObjectId& objId,

LPDISPATCH pApp);

HRESULT

AcAxGetIUnknownOfObject(LPUNKNOWN* ppUnk, AcDbObject* pObj,

LPDISPATCH pApp);



Объекты COM созданы через CoCreateInstance () использование CLSID, который идентифицирует тип объекта. Чтобы отыскивать передачу CLSID для данного объекта AcDbObject-derived, используйте его getClassID () функция. Эта функция определена на уровне AcDbObject и перегружена на каждом другом уровне в иерархии классов, которая имеет различный тип объекта COM, чтобы представить это.

// Получить соответствующий класс обертки COM ID.

//

virtual Acad::ErrorStatus getClassID(CLSID* pClsid) const;

Например, если Вы создаете заказной примитив (другими словами, AcDbEntity -dполучил{*происходил*} класс) и не перегружать getClassID (), тогда возвращенный CLSID - тот для AcadEntity. Это означает, что ваши заказные примитивы будут по крайней мере иметь функциональные возможности основного уровня, даже если Вы не обеспечиваете поддержку COM для вашего примитива.

Имеется дополнительное требование для использования следующих API, чтобы создать объекты COM для вашего AcDbObject-полученного класса:


IAcadBlock::AddCustomObject(BSTR ClassName, LPDISPATCH* pObject)

IAcadModelSpace::AddCustomObject(BSTR ClassName,

LPDISPATCH* pObject)

IAcadPaperSpace::AddCustomObject(BSTR ClassName,

LPDISPATCH* pObject)

CAcadDictionary::AddObject(BSTR Keyword, BSTR ObjectName,

IAcadObject** pObject)

Эти функции берут фактическое AcDbObject-полученное имя класса (например, AcDbMyObject) и создают объект COM для Вас. После того, как объект COM создан, IAcadBaseObjectId:: SetObjectId () будет,  обратился к этому, чтобы позволить AcDbObject-полученному классу быть инициализированным и добавлен к базе данных.

К obtai n CLSID для данного AcDbObject-полученного имени класса, системный реестр системы должен содержать вход с именем вашего AcDbObject и его передачи CLSID значение.

Размещение системного реестра напоминает это:

HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\

ObjectDBX\

ActiveXCLSID\

AcRxClassName\CLSID:REG_SZ:

{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

В примере выше, замените AcRxClassName именем вашего AcDbObject-полученного класса (другими словами, AcDbMyObject).


Содержание раздела