通过 ActiveX 自动化公开 ObjectARX 函数
在最简单的情况下,COM 包装类将公开一个或多个函数,这些函数要提供给使用 VBA 等编程环境的开发人员。同样,您可以选择将 ObjectARX 代码包含在 COM DLL 中,或者为 COM 和 ObjectARX 组件创建单独的 DLL。以下各节提供了解释所需过程的过程。 为 ObjectARX 应用程序创建自动化包装器项目
#include "dbmain.h"
#include "acad24.h"
#include "axtempl.h" // main ActiveX Automation template // header file
通过将以下声明添加到其派生列表的末尾来更改 COM 类的派生: public IRetrieveApplicationImpl 将以下条目添加到:COM_MAP COM_INTERFACE_ENTRY(IRetrieveApplication) 在 IDL 文件中,在 和 之后添加以下代码:importlib("stdole32.tlb")importlib("stdole2.tlb") importlib("acax24enu.tlb"); // revise the path to match your
// own AutoCAD installation
请确保替换与AutoCAD安装匹配的路径。 设置包装器后,您需要提供接口以通过 ActiveX 公开您的功能。 通过 ActiveX 公开功能通过从“类视图接口”快捷菜单中选择“添加方法”或“添加属性”,将所需的 ActiveX 方法和属性添加到包装类中。在 COM 类 CPP 文件中,ATL 生成类似于以下内容的存根: STDMETHODIMP CAsdkSquareWrapper::get_Number(short *pVal)
{
}
STDMETHODIMP CAsdkSquareWrapper::put_Number(short newVal)
{
}
通常,这些成员将用于包装对 ObjectARX 应用程序的调用。 将实现代码添加到新的 COM 类方法和属性中。下面的示例演示一个示例属性实现: STDMETHODIMP CAsdkSquareWrapper::get_Number(short *pVal)
{
// TODO: Add your implementation code here
AcDbObjectPointer<AsdkSquare> pSq(m_objId, AcDb::kForRead);
if (pSq.openStatus() != Acad::eOk)
return E_ACCESSDENIED;
int id;
pSq->squareId(id);
*pVal = id;
return S_OK;
}
STDMETHODIMP CAsdkSquareWrapper::put_Number(short newVal)
{
AcAxDocLock docLock(m_objId, AcAxDocLock::kNormal);
if(docLock.lockStatus() != Acad::eOk)
return E_ACCESSDENIED;
AcDbObjectPointer<AsdkSquare> pSq(m_objId, AcDb::kForWrite);
if (pSq.openStatus() != Acad::eOk)
return E_ACCESSDENIED;
pSq->setSquareId(newVal);
return S_OK;
}
根据生成和注册 COM DLL 中的步骤生成并注册应用程序。 父主题: |
|Archiver|CAD开发者社区
( 苏ICP备2022047690号-1 苏公网安备32011402011833)
GMT+8, 2025-10-29 12:29
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.