最近更新于 2025-08-08 17:13
基本环境
- Windows 11 24H2
- AutoCAD Mechanical 2026
- Visual Studio 2022(需要安装“C++ 桌面开发”,建议右侧手动增加勾选“MFC”)
验证基于 AutoCAD 2025 ObjectARX(C++)开发环境搭建:https://blog.iyatt.com/?p=16480
开发环境配置
资源下载安装
ObjectARX SDK 下载安装
ObjectARX SDK 2026 下载地址:https://aps.autodesk.com/developer/overview/autocad-objectarx-sdk-downloads
下载后运行,这是一个自解压程序,自己选择一个路径,注意记下这个路径,后续需要用到。我这里就释放到 C:\ObjectARX2026
解压完就自动退出了,
在设置的解压路径下的 CDROM1 文件夹下可以看到 ObjectARX 的相关文件
Wizard Wizards 下载安装
ObjectARX Wizards 2026 下载地址:https://aps.autodesk.com/developer/overview/autocad
直接点 Download 下载最新版,当前就是 2026 版。下载历史版本就展开“Download past ObjectARX Wizards”
下载的是 zip 压缩文件,自己解压后,可以看到 msi 安装程序
右键复制文件地址
按Win
键打开开始菜单,输入 cmd 搜索,以管理员身份运行
在 cmd 中点击右键,会把路径粘粘进去,回车执行
间接实现以管理员身份运行 msi 安装程序,如果不以管理员身份运行安装,安装设置的参数会无效,后面 VS 创建项目的时候会卡在创建页,无法继续下一步
点 Next 进入下一步
看到下面界面
- 第一个框 RDS symbol(Registered Developer Symbol)相当于是是一个开发者标识,后面编译程序的时候会把这个标识插入程序文件名的开头,这样即使不同开发者对自己的扩展程序取了同样的名字,但是开发者标识不一样也可以区分。填写很讲究,要考虑文件命名、C++ 标识符命名同时满足的规则,因为这个 RDS 会出现在文件名中,还会出现在代码中,要是填写了不允许的字符,编译的时候就会报错了。比如我自己用的名字是 IYATT-yx,这里就填写的 IYATTyx,因为 C++ 标识符不允许 – 符号,只能是字母、数字、下划线,且不能以数字开头。
- 第二个框填的路径和前面 ObjectARX SDK 解压的路径有关,在前面解压路径的基础上再加上 CDROM1。比如前面我选的解压路径是 C:\ObjectARX2026,这里就要填成 C:\ObjectARX2026\CDROM1
- 第三个框填 AutoCAD 可执行文件的路径,可以选中快捷方式,按
Alt
+Enter
打开属性,点击打开文件所在的位置,复制地址栏的路径即可
填好后点 Next 进入下一步,点 Install Now 开始安装
安装完成点 Close 关闭
改进设置
上述操作安装了 SDK 和 Wizards,SDK 是开发依赖的库文件,Wizards 提供了 VS 项目创建模板。
虽然 Wizards 提供的模板已经让开发者省去自己配置库链接等一系列的工作,可以做到创建好项目就能直接写代码编译,但调试仍然不方便,启动调试只是会自动打开 CAD,加载插件要手动操作。
下面我提供了方案实现调试时自动加载,另外还有其它错误项纠正、改进优化设置。
调试运行时 CAD 自动加载程序(建议)
默认的模板调试启动可以自动启动 CAD,但是不会自动加载程序,这样还要手动去加载程序调试,显得麻烦,我提供了一套自动加载的方案。
修改 Wizards 创建项目时执行的源码
以管理员身份编辑 "C:\Program Files (x86)\Autodesk\ObjectARX 2026 Wizards\ArxAppWiz\Scripts\1033\default.js"
找到 return oProj;
在他的前面行插入下面代码
// 创建 scr 脚本
/////////////////////////////////////////////
// 写 scr 文件
function writeScrFile(filename, content)
{
var fso = new ActiveXObject("Scripting.FileSystemObject");
var startScrPath = strProjectPath + "\\" + filename;
var startScrFile = fso.CreateTextFile(startScrPath, true);
startScrFile.Write(content);
startScrFile.Close();
}
// 确定程序扩展名
var extension = "";
if (wizard.FindSymbol("APP_ARX_TYPE")) {
extension = ".arx";
} else if (wizard.FindSymbol("APP_DBX_TYPE")) {
extension = ".dbx";
} else if (wizard.FindSymbol("APP_CRX_TYPE")) {
extension = ".crx";
} else {
extension = ".arx";
}
debugFilename = "debug.scr"; // 调试版脚本
releaseFilename = "release.scr"; // 发布版脚本
var debugContent = "ARX L " + "\"" + strProjectPath + "\\x64\\Debug\\" + wizard.FindSymbol("RDS_SYMB") + strProjectName + extension + "\" ";
var releaseContent = "ARX L " + "\"" + strProjectPath + "\\x64\\Release\\" + wizard.FindSymbol("RDS_SYMB") + strProjectName + extension + "\" ";
writeScrFile(debugFilename, debugContent);
writeScrFile(releaseFilename, releaseContent);
/////////////////////////////////////////////
修改属性模板
以管理员身份编辑 C:\Program Files (x86)\Autodesk\ObjectARX 2026 Wizards\ArxAppWiz\Templates\1033\Autodesk.arx-2026.props
查找关键词 LocalDebuggerCommand。将它所在的 PropertyGroup 删除掉
然后在删除的位置插入下面内容
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
<!-- Local Windows debugger -->
<LocalDebuggerDebuggerType>Auto</LocalDebuggerDebuggerType>
<LocalDebuggerCommand>$(AcadDir)$(AcadExe)</LocalDebuggerCommand>
<LocalDebuggerCommandArguments>/nologo /b $(ProjectDir)debug.scr</LocalDebuggerCommandArguments>
<LocalDebuggerWorkingDirectory>$(ProjectDir)</LocalDebuggerWorkingDirectory>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Release'">
<!-- Local Windows debugger -->
<LocalDebuggerDebuggerType>Auto</LocalDebuggerDebuggerType>
<LocalDebuggerCommand>$(AcadDir)$(AcadExe)</LocalDebuggerCommand>
<LocalDebuggerCommandArguments>/nologo /b $(ProjectDir)release.scr</LocalDebuggerCommandArguments>
<LocalDebuggerWorkingDirectory>$(ProjectDir)</LocalDebuggerWorkingDirectory>
</PropertyGroup>
添加信任
程序没有签名证书,一加载就会问是否允许,这就很麻烦,可以把项目开发目录添加 CAD 信任,这样就会直接执行加载了
打开 AutoCAD,新建图纸。执行 OP 命令打开选项,切换到系统选项卡
点击安全选项,
复制要添加信任的目录,比如我这里要添加我的开发目录 C:\work\development。然后在安全选项页面 ,点击添加输入路径,另外在路径后加 \…,比如我这里就要填写 C:\work\development\…。后面加三点后,就会信任这个路径及它的子目录,不加三点只信任这个路径下一层,不信任子目录。填写后,点确定,可以关闭 AutoCAD。
关闭较小类型检查(必要)
VS 中 Debug 默认开启了较小类型检查,但这不是被 C++ 标准库支持的
编译会导致报错C1189 /RTCc rejects conformant code
这里需要修改 Wizards 的项目模板,以实现默认关闭较小类型检查,避免每次创建项目后需要去改。
以管理员身份编辑 C:\Program Files (x86)\Autodesk\ObjectARX 2026 Wizards\ArxAppWiz\Templates\1033\Autodesk.arx-2026.props,可以以管理员身份运行记事本,再用记事本编辑。
在 Project 层内找到一个空位置,插入下面内容
<ItemDefinitionGroup>
<ClCompile>
<SmallerTypeCheck>false</SmallerTypeCheck>
</ClCompile>
</ItemDefinitionGroup>
禁用安全检查(可选)
VS 默认开启了安全检查,要是你不用 _s 结尾的安全函数,就会报错。我是不喜欢用安全函数的,也不想每次创建项目后手动修改项目属性,这里就直接修改 Wizards 项目模板。
以管理员权限编辑 C:\Program Files (x86)\Autodesk\ObjectARX 2026 Wizards\ArxAppWiz\Templates\1033\Autodesk.arx-2026.props
在 Project 层内找到一个空位置,插入下面内容
<ItemDefinitionGroup>
<ClCompile>
<BufferSecurityCheck>false</BufferSecurityCheck>
</ClCompile>
</ItemDefinitionGroup>
纠正 Wizards 错误
Wizards 在 GitHub 上是开源的,项目地址:https://github.com/ADN-DevTech/ObjectARX-Wizards
已发现的错误我都提交了 PR,至于是否响应我就不知道了。
纠正 StdAfx.h 模板错误
PR:https://github.com/ADN-DevTech/ObjectARX-Wizards/pull/6
这个版本的 Wizards 模板里提供的 StdAfx.h 有一处错误,比如我创建了一个项目 ARXPROJECT2,StdAfx.h 文件里在 define 后面少了一个空格,编译就会报错。
以管理员身份编辑 "C:\Program Files (x86)\Autodesk\ObjectARX 2026 Wizards\ArxAppWiz\Templates\1033\StdAfx.h"
看到第 28 行,把
#define[!output UPPER_CASE_PROJECT_NAME] _MODULE
改为
#define [!output UPPER_CASE_PROJECT_NAME] _MODULE
就是加一个空格
纠正 DockControlBar 模板错误
PR:https://github.com/ADN-DevTech/ObjectARX-Wizards/pull/7
CAcUiDockControlBar 继承自 CAdUiDockControlBar,它们的 Create 函数其中一个明显匹配此处模板的签名为
BOOL Create (LPCTSTR lpszClassName, LPCTSTR lpszWindowName,
DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID, CCreateContext* pContext = NULL);
但是使用 Wizards 模板创建的继承自 CAcUiDockControlBar 的子类中有一段代码如下,代码中将 CString 的 strWndClass 传给 Create 第一个参数,但这个参数要求是 LPCTSTR;这里的子类重写 Create 参数时声明的 lpszTitle 参数类型是 LPCSTR,又把这个参数传给 Create 第二个参数,但 Create 要求这个参数也是 LPCTSTR。
LPCSTR 是仅用于多字节字符集的字符串指针,LPCTSTR 是基于 TCHAR 的字符串指针,可以自适应多字节字符集和 Unicode。
BOOL 子类::Create (CWnd *pParent, LPCSTR lpszTitle) {
CString strWndClass ;
strWndClass =AfxRegisterWndClass (CS_DBLCLKS, LoadCursor (NULL, IDC_ARROW)) ;
CRect rect (0, 0, 250, 200) ;
if (!CAcUiDockControlBar::Create (
strWndClass, lpszTitle, WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN,
rect, pParent, 0
)
)
return (FALSE) ;
SetToolID (&clsBar) ;
// TODO: Add your code here
return (TRUE) ;
}
以管理员身份编辑 C:\Program Files (x86)\Autodesk\ObjectARX 2026 Wizards\ArxWizMFCSupport\Templates\1033\DockControlBar.cpp,将
BOOL [!output CLASS_NAME]::Create (CWnd *pParent, LPCSTR lpszTitle) {
CString strWndClass ;
strWndClass =AfxRegisterWndClass (CS_DBLCLKS, LoadCursor (NULL, IDC_ARROW)) ;
改为
BOOL [!output CLASS_NAME]::Create (CWnd *pParent, LPCTSTR lpszTitle) {
LPCTSTR strWndClass = AfxRegisterWndClass (CS_DBLCLKS, LoadCursor (NULL, IDC_ARROW)) ;
以管理员身份编辑 C:\Program Files (x86)\Autodesk\ObjectARX 2026 Wizards\ArxWizMFCSupport\Templates\1033\DockControlBar.h,将
virtual BOOL Create (CWnd *pParent, LPCSTR lpszTitle) ;
改为
virtual BOOL Create (CWnd *pParent, LPCTSTR lpszTitle) ;
测试
打开 VS,新建一个 ARX/DBX 项目
设置项目名称、路径,点击创建
这里默认填写的 RDS 就是安装 Wizards 填写的,这里也可以修改,点 Finish 完成创建
编辑 acrxEntryPoint.cpp 文件,在 // TODO: Add your initialization code here 注释下写一行代码,添加在这里会在程序被 CAD 加载后即刻执行
acutPrintf(L"\nhello world!\n");
按F5
调试运行,编译后自动启动 CAD,然后自动加载程序到 CAD 中,可以看到下面打印输出了 “hello world!”,代表环境验证成功
开发资料
类图
在 ObjectARX 下的 classmap 目录中,有一个 classmap.dwg 文件,这是用 CAD 绘制的类图
文档
在 ObjectARX 下的 docs 目录中存放着 chm 文档