if(docLock. lockStatus() != Acad::eOk)
{
return E_FAIL;
}
// It is now safe to modify the database
//
return S_OK;
}
Создание Файла Системного реестра
Для вашего сервера COM, чтобы быть полностью функциональный, все компоненты и их соответствующие интерфейсы должны быть зарегистрированы с системой. Кроме того, библиотека типов должна также быть зарегистрирована так, чтобы это могло использоваться, чтобы осуществить IDISPATCH для ваших компонентов.
Вхождения системного реестра типично создаются в течение инсталляции вашего программного обеспечения.
Ниже Вас найдет, что информация помогает создает файл системного реестра (.reg), который является высоко полезным и идентифицирует минимальное количество информации, требуемой для вашего сервера COM.
Общий формат (использование compoly. reg как пример):
REGEDIT
; type library entries
HKEY_CLASSES_ROOT\TypeLib\{uuid of type library}
HKEY_CLASSES_ROOT\TypeLib\{uuid of type library}\1.0 =
compoly 1.0 Type Library HKEY_CLASSES_ROOT\TypeLib\
{uuid of type library}\1.0\HELPDIR = x:\some\path\to
HKEY_CLASSES_ROOT\TypeLib\{uuid of type library}\1.0\0\win32 =
x:\some\path\to\compoly. tlb
HKEY_CLASSES_ROOT\TypeLib\{uuid of type library}\1.0\9\win32 =
x:\some\path\to\compoly. tlb
; coclass entries
HKEY_CLASSES_ROOT\CLSID\{uuid of coclass} = ComPolygon Class
HKEY_CLASSES_ROOT\CLSID\{uuid of coclass}\InProcServer32 =
x:\some\path\to\compoly. dll
; interface entries
HKEY_CLASSES_ROOT\Interface\{uuid of interface} =
IComPolygon Interface
HKEY_CLASSES_ROOT\Interface\{uuid of interface}\TypeLib =
{uuid of type library}
HKEY_CLASSES_ROOT\Interface\{uuid of interface}\ProxyStubClsid32 =
{00020424-0000-0000-C000-000000000046}
Последние две секции повторятся для каждого coclass и связывать с помощью интерфейса в вашей библиотеке типов. Файл IDL имел обыкновение формировать библиотеку типов, будет содержать весь uuids, который Вы должны заполнить пробелы выше. Ниже прокомментированы выборки от compoly. idl, которые идентифицируют каждый uuid.
[
// uuid of type lib.
//
uuid(45C7F028-CD9A-11D1-A2BD-080009DC639A),
version(1.0),
helpstring("compoly 1.0 Type Library")
]
library COMPOLYLib
{
// ... Code cut out for brevity.
// IComPolygon interface
[
object,
// uuid of interface
//
uuid(45C7F035-CD9A-11D1-A2BD-080009DC639A),
dual,
helpstring("IComPolygon Interface"),
pointer_default(unique)
]
interface IComPolygon : IAcadEntity
{
// ... Code cut out for brevity.
};
// ... Code cut out for brevity.
// ComPolygon coclass
[
// uuid of coclass
//
uuid(45C7F036-CD9A-11D1-A2BD-080009DC639A),
helpstring("ComPolygon Class"),
noncreatable
]
coclass ComPolygon
{
[default] interface IComPolygon;
[source] interface IAcadObjectEvents;
};
};
Демонстрация Функциональных возможностей Автоматизации
Вы можете делать функции, объекты, или примитивы, закодированные в ObjectARX доступными разработчикам, кто обращаются к модели объекта ActiveX через VBA или некоторую другую среду программирования.
Введение Файла Проекта ATL
Обертки COM могут быть созданы как отдельный DLLS, или объединен с вашим ObjectARX-приложением. Оба метода используют ATL Microsoft AppWizard, чтобы упростить процесс. Отдельный DLL позволяет системе управлять ресурсами более эффективно; это может выпускать объекты COM, когда они не необходимы, даже если ObjectARX-приложение не может быть разгружено.
Основывать проект для обертки COM в отдельном DLL
1. Удостоверятся axauto15.dll, который должен быть в том же самом каталоге как acad. exe, находится в вашем пути поиска файлов.
2. От меню Microsoft visual c ++ File, выберите Новый.
3. COM ATL Выбора AppWizard на позиции табуляции Projects и вводит проектное имя.
4. Выбирают тип сервера DLL. Дополнительные проектные назначения необязательные.
5. Выбирают Finish и OK.
6. От меню Insert или подручного меню представления Класса, выберите Новый Объект ATL.
7. Выбирают Простой Объект в категории Объектов и выбирают Затем.
8. Вводят C++ Короткое Имя на позиции табуляции Names; Мастер снабдит значения по умолчанию для остающихся имен.
9. На позиции табуляции Attributes, выберите Поддержку IErrorInfo.
10. Выбирают ХОРОШО.
11. От меню Project, выберите Назначения.
12. На C / C ++ позиция табуляции, выберите Язык C++ из раскрывающегося списка Категории, и выбор Позволяет обработку особых ситуаций.
13. На позиции табуляции Link, добавьте axauto15.lib, oleaprot. lib, и любые другие упомянутые ObjectARX библиотеки.
Основывать проект, который объединяет обертку COM с существующим ObjectARX-приложением
1. Удостоверятся axauto15.dll, который должен быть в том же самом каталоге как acad. exe, находится в вашем пути поиска файлов.
2. От меню Microsoft visual c ++ File, выберите Новый.
3. COM ATL Выбора AppWizard на позиции табуляции Projects и вводит проектное{*строительное*} имя.
4. Выбирают тип сервера DLL. Дополнительные проектные{*строительные*} назначения необязательные.
5. Выбирают Конец и OK.
6. Добавляют весь CPP и H файлы от вашего ObjectARX-приложения.
7. Модифицируют ваши включаемые и библиотечные пути и DLL точку входа как соответствующий ObjectARX-приложению.
8. Модифицируют файл DEF, добавляя точки входа. Измените имя DLL, чтобы иметь ARX расширение.
9. В этой точке Вы должны быть способны компилировать, чтобы удостовериться, что ObjectARX-приложение формирует успешно.
10. От меню Insert или подручного меню представления Класса, выберите Новый Объект ATL.
11. Выбирают Простой Объект в категории Объектов и выбирают Затем.
12. Вводят C++ Короткое Имя на позиции табуляции Names; Мастер снабдит значения по умолчанию для остающихся имен.
13. На позиции табуляции Attributes, выберите Поддержку IErrorInfo.
14. Выбирают OK.
15. От меню Project, выберите Назначения.
16. На C / C ++ позиция табуляции, выберите Язык C++ из раскрывающегося списка Категории, и выбор Позволяет обработку особых ситуаций.
17. На позиции табуляции Link, добавьте axauto15.lib, oleaprot. lib, и любые другие упомянутые ObjectARX библиотеки.
18. Выбирают OK.
Запись Обертки COM
Вы можете записывать класс обертки COM, чтобы добавить функциональные возможности выбора к ActiveX модели Автоматизации, или Вы можете выставлять{*подвергать*} заказные объекты или примитивы.
Добавление Функциональных возможностей к Объектной Модели
В самом простом случае, ваш класс обертки COM выставит{*подвергнет*} один или большее количество функций, которые Вы хотели бы делать доступным разработчикам, использующим среды программирования типа VBA.
Создавать обертку Автоматизации для ObjectARX-приложения
1 Основанный ваш проект согласно шагам в “ Введение Файла Проекта ATL. ”
2 В файле заголовка объекта COM, добавьте #include "Axtempl. h" (главное ActiveX файл заголовка шаблона Автоматизации).
3, если Вы хотите, прикладное свойство, добавляет следующий вход в COM_MAP:
COM_INTERFACE_ENTRY(IRetrieveApplication)
4 В файле IDL, добавьте importlib ("c:\ACAD\acad. tlb"); после importlib stdole32.tlb и importlib stdole2.tlb. Удостоверитесь, чтобы использовать правильный путь, который соответствует вашей инсталляции AutoCAD.
5, если ObjectARX-приложение и обертка COM объединено, добавьте следующий код к вашему главному CPP файл, и назовите это DllMain в AcRx:: kInitAppMsg и AcRx:: kUnloadAppMsg с соответствующими параметрами.
Это инициализирует карту объекта ATL, среди других вещей.
extern "C" HINSTANCE _hdllInstance;
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance,
DWORD dwReason, LPVOID /*lpReserved*/);
6 Компоновки и регистр приложение согласно шагам в “ Формирование и Регистрация COM DLL. ”
Добавление Заказного Объекта или Примитива к Объектной Модели
Если ваш класс обертки COM формирует заказной объект или примитив, Вы будете должны изменить ATL-ГЕНЕРИРОВАННЫЙ код, чтобы поддержать соответствующие интерфейсы.
Каталог \docsamps\square содержит пример класса обертки для заказного примитива, письменного как отдельный DLL.
Создавать обертку Автоматизации для заказного объекта или примитива
1 Основанный ваш проект согласно шагам в “ Введение Файла Проекта ATL. ”
2 В файле заголовка объекта COM, включите axtempl. h (главное ActiveX файл заголовка шаблона Автоматизации) и файл (ы) заголовка для ваших заказных объектов или примитивов.
3 Изменяют образование из объекта COM или примитива, удаляя IDISPATCHIMPL часть образования и заменяя это со следующим кодом:
// Для заказного объекта.
//
public IAcadObjectDispatchImpl<CWrapperClass,
&CLSID_WrapperClass, IWrapperClass,
&IID_IWrapperClass,&LIBID_LIBRARYLib>
// For a custom entity.
//
public IAcadEntityDispatchImpl<CWrapperClass,
&CLSID_WrapperClass, IWrapperClass,
&IID_IWrapperClass,&LIBID_LIBRARYLib>
4 Добавляют следующие вхождения в COM_MAP:
COM_INTERFACE_ENTRY(IAcadBaseObject)
COM_INTERFACE_ENTRY(IAcadObject)
COM_INTERFACE_ENTRY(IAcadEntity) // For an entity only.
COM_INTERFACE_ENTRY(IRetrieveApplication)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer) // Only
// necessary to support events.
5 Добавляют следующую требуемую перегрузку к заголовку file:
// IAcadBaseObjectImpl
//
virtual HRESULT
CreateNewObject(
AcDbObjectId& objId,
TCHAR* entryName,
TCHAR* keyName);
Эта абстрактная функция, определенная в IACADBASEOBJECTIMPL шаблоне должна быть перегружена, чтобы позволить Вам добавлять заданные по умолчанию объекты к базе данных.
6 Осуществляют CreateNewObject () для любго объекта или определенного примитива.
Следующий пример показывает выполнение CreateNewObject () из AsdkSquareWrapper:
HRESULT CAsdkSquareWrapper::CreateNewObject(
AcDbObjectId& objId,
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


