Создавать обертку Автоматизации для заказного объекта или примитива
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,
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. ”