AcDbObjectId& ownerId,
TCHAR* keyName)
{
try
{
//AXEntityDocLock(ownerId);
Acad::ErrorStatus es;
AcDbObjectPointer<AsdkSquare> pSq;
if((es = pSq. create()) != Acad::eOk)
throw es;
AcDbDatabase* pDb = ownerId. database();
pSq->setDatabaseDefaults(pDb);
AcDbBlockTableRecordPointer
pBlockTableRecord(ownerId, AcDb::kForWrite);
if((es = pBlockTableRecord. openStatus()) != Acad::eOk)
throw es;
if((es = pBlockTableRecord->appendAcDbEntity(objId, pSq. object())) != Acad::eOk)
throw es;
}
catch(const Acad::ErrorStatus)
{
//To become more sophisticated
//
return Error(L"Failed to create square",
IID_IAsdkSquareWrapper, E_FAIL);
}
return S_OK;
}
7 В файле IDL, добавьте importlib ("c:\ACAD\acad. tlb"); после importlib stdole32.tlb и importlib stdole2.tlb. Удостоверитесь, чтобы использовать правильный путь, который соответствует вашей инсталляции AutoCAD.
8 Перемещают acad. tlb секцию в вершину файла IDL и перемещают ваш заказной объектный код так, чтобы это было в пределах той секции.
ОБРАТИТЕ ВНИМАНИЕ, что модификации файла IDL заставят компилятор выпускать предупреждение, заявляющее, что интерфейс не соответствует. Вы можете игнорировать это сообщение.
9 Изменяют{*заменяют*} образование в файле IDL от IDISPATCH до IACADOBJECT для заказного объекта или IACADENTITY для заказного примитива.
10 В секции файла IDL, который соответствует вашей обертке coclass, добавьте [источник] связывают с помощью интерфейса IACADOBJECTEVENTS; после [заданной по умолчанию] линии, чтобы поддерживать события. Файл IDL будет теперь казаться подобным следующему коду:
import "oaidl. idl";
import "ocidl. idl";
[
uuid(800F70A1-6DE9-11D2-A7A6-0060B0872457),
version(1.0),
helpstring("AsdkSquareLib 1.0 Type Library")
]
library ASDKSQUARELIBLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
importlib("v:\acad\acad2000\acad. tlb");
[
object,
uuid(800F70AD-6DE9-11D2-A7A6-0060B0872457),
dual,
helpstring("IAsdkSquareWrapper Interface"),
pointer_default(unique)
]
interface IAsdkSquareWrapper : IAcadEntity
{
[propget, id(1), helpstring("property Number")]
HRESULT Number([out, retval] short *pVal);
[propput, id(1), helpstring("property Number")]
HRESULT Number([in] short newVal);
};
[
uuid(800F70AE-6DE9-11D2-A7A6-0060B0872457),
helpstring("AsdkSquareWrapper Class")
]
coclass AsdkSquareWrapper
{
[default] interface IAsdkSquareWrapper;
[source] interface IAcadObjectEvents;
};
};
11 После #include <Atlcom. h> в stdafx. h, включите acad15.h, сначала, сопровождаемый любыми необходимыми ObjectARX файлами заголовка.
12 в конце stdafx. cpp, включите acad15_i. c.
13, если приложение ARX и обертка COM объединено, добавьте следующий код к вашему главному CPP файл, и назовите это DllMain в AcRx:: kInitAppMsg и AcRx:: kUnloadAppMsg с соответствующими параметрами. Это инициализирует карту объекта ATL, среди других вещей:
extern "C" HINSTANCE _hdllInstance;
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance,
DWORD dwReason, LPVOID /*lpReserved*/);
14 Добавляют желательные ActiveX методы, и свойства к вашему классу обертки выбором Добавляют Метод или Добавляют Свойство от подручного меню Интерфейса представления{*вида*} Класса.
15 Для любого ObjectARX обертываемого класса, перегрузите getClassId () функция для заказного объекта или примитива со следующим:
Acad::ErrorStatus
Class::getClassID(CLSID* pClsid) const
{
*pClsid = CLSID_WrapperClass;
return Acad::eOk;
}
16 В файле, который содержит, перегрузка для getClassId (), добавляет:
#include <objbase. h>
#include <initguid. h>
#include "library_i. c" // Файл, содержащий фактические определения
// IIDs и CLSIDS для проекта COM.
17 Компоновки и регистр приложение согласно шагам в “ Формирование и Регистрация COM DLL. ”
Формирование и Регистрация COM DLL
Файл системного реестра, который описывает ваше приложение, библиотеку типов, и объекты Automation, должен быть объединен в системный реестр системы Windows прежде, чем компоненты в вашем DLL будут доступны. Некоторые дополнительные шаги требованы, чтобы связать успешно COM DLL и отдельное ObjectARX-приложение.
Готовить COM DLL, который является отдельным от ObjectARX-приложения
1 Формируют COM DLL.
2 Добавляют любые украшенные названия символа, которые появляются по ошибкам компоновщика как нерешенные внешние символы к секции Экспорта ObjectARX файла DEF.
3 Восстанавливают ObjectARX-приложение.
4 В COM DLL, выберите Назначения из меню Project.
5 На позиции табуляции Link, добавьте библиотеку для вашего ObjectARX-приложения.
6 Выбирают OK.
7 Продолжают шаги ниже, чтобы формировать и регистрировать ваш COM DLL.
Формировать и регистрировать ваш составляющий сервер
1 Формируют приложение COM.
Сообщение может казаться, указывая, что REGSRVR32 не сумел загружать AutoCAD.
Чтобы устранять это сообщение в будущем, удалите все заказные шаги компоновки для регистрации сервера COM от ваших назначений проекта COM.
2 Создают файл REG для вашего приложения с GUIDS для объекта и библиотеки типов, которые соответствуют в файле IDL.
Файл REG должен регистрировать следующую информацию:
§ имя объекта AcRxClass (так, чтобы GetIUnknownOfObject мог располагать класс)
§ библиотека типов объекта (так, чтобы, когда ATL вызывает LoadRegTypeLib, это будет преуспевать)
§ прикладное имя как сервер для объекта COM с той частностью CLSID (так, чтобы CoCreateInstance () работал правильно)
Следующий пример - файл REG для AsdkSquareWrapper:
REGEDIT
; This .REG file may be used by your SETUP program.
; If a SETUP program is not available, the entries below will be
; registered in your InitInstance automatically with a call to
; CWinApp::RegisterShellFileTypes and
; COleObjectFactory::UpdateRegistryAll.
HKEY_CLASSES_ROOT\TypeLib\{800F70A1-6DE9-11D2-A7A6-0060B0872457}
HKEY_CLASSES_ROOT\TypeLib\{800F70A1-6DE9-11D2-A7A6-0060B0872457}
\1.1 = AsdkSquareLib 1.0 Type Library
HKEY_CLASSES_ROOT\TypeLib\{800F70A1-6DE9-11D2-A7A6-0060B0872457}
\1.1\0\win32=
E:\TEMP\square\AsdkSquareLib\Debug\AsdkSquareLib. dll
HKEY_CLASSES_ROOT\TypeLib\{800F70A1-6DE9-11D2-A7A6-0060B0872457}
\1.1\9\win32 =
E:\TEMP\square\AsdkSquareLib\Debug\AsdkSquareLib. dll
HKEY_CLASSES_ROOT\CLSID\{800F70AE-6DE9-11D2-A7A6-0060B0872457} =
AsdkSquareWrapper Class
HKEY_CLASSES_ROOT\CLSID\{800F70AE-6DE9-11D2-A7A6-0060B0872457}
\InProcServer32 =
E:\TEMP\square\AsdkSquareLib\Debug\AsdkSquareLib. dll
HKEY_CLASSES_ROOT\Interface\{800F70AD-6DE9-11D2-A7A6-0060B0872457}
= IAsdkSquareWrapper Interface
HKEY_CLASSES_ROOT\Interface\{800F70AD-6DE9-11D2-A7A6-0060B0872457}
\TypeLib = {E3D2C633-69C9-11D2-A7A2-0060B0872457}
HKEY_CLASSES_ROOT\Interface\{800F70AD-6DE9-11D2-A7A6-0060B0872457}
\ProxyStubClsid32 = {00020424-0000-0000-C000-000000000046}
3 Выполненный файл РЕДЖА от Проводника.
Менеджер Свойства объекта API
Менеджер Свойства объекта (OPM) - инструмент, который позволяет пользователям рассматривать и изменять свойства примитивов и объектов легко. См. Руководство программиста AutoCAD для подробной информации относительно особенностей OPM и интерфейса пользователя.
OPM поддерживает два вида свойств. Первый - свойства, которые определены для объекта статически во времени компиляции, названных статических свойствах.
Динамические свойства, которые являются свойствами, которые могут быть добавлены и конфигурирован во время выполнения, также поддержаны. Для статических свойств, ObjectARX-приложения могут обеспечивать COM классами “обертки” для их заказных объектов. OPM будет использовать эти классы, чтобы определить, который статические свойства являются ли доступным для того объекта и как к “flavorize” те свойства для дисплея (типа, свойство требуют заказного поля со списком в OPM, или должны поднять диалог для редактирования свойства?). Для динамических свойств, ObjectARX, VB, или приложений VBA может создавать “ свойство plug-ins ” использование OPM Динамического API Свойств, чтобы конфигурировать и управлять свойствами для любого аборигена или класса пользователя во время выполнения.
Выполнение COM AutoCAD
OPM - по существу контроль, который анализирует информацию типа от объектов COM, чтобы определить их свойства. Когда объекты в рисунке отобраны, набор выборов преобразован в массив указателей IUnknown, представляющих объекты COM, которые переносят по словам все родные примитивы в AutoCAD. Эти обертки объекта COM - фундаментальная поддержка для ActiveX Автоматизации, связывают с помощью интерфейса и - основные объекты, с которыми OPM связывается.
Эти обертки объекта COM осуществляют IDISPATCH также как другие интерфейсы.
IDispatch - COM, связывают с помощью интерфейса использования OPM, чтобы получить и установить данные свойства. Это - также родное объектное представление в VB и VBA. Чтобы определять, который, свойства являются доступными для объекта, OPM, вызывают IDISPATCH:: GetTypeInfo (), который все обертки COM AutoCAD осуществляют.
Эта функция возвращает информацию типа для объекта (объект, который осуществляет ITYPEINFO). ITypeInfo - стандарт интерфейс Microsoft, который переносит по словам структуру данных, описывающую методы и свойства, доступные на том объекте. Коллекции информации типа, используемой VB и VBA, чтобы определить модель объекта ActiveX названы библиотеки типа.
OPM берет информацию свойства, и основанный на типе свойства, поскольку это определено в IDL, создает редактора свойства окно, соответствующее тому типу свойства. Например, если тип свойства числовой или текстовый, это создает окно редактирования. Если это - перечисление, это создает поле со списком с перечисленным списком значения. Если это - готовое свойство типа Цвета, Уровня, Типа линии, Lineweight, или других встроенных свойств, это создает стандарт drop-downs для тех, которые являются, тот же самый что касается Инструментальной панели Свойства объекта (OPT).
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |


