
简介针对AutoCAD 2010二次开发中ObjectARX向导在Visual Studio 2008环境下的界面异常问题该压缩包提供官方中文语言包的修复资源。很多开发者在安装ObjectARX Wizards后会遇到工具栏图标不显示或显示为空白方块的情况原因通常是向导资源文件未正确匹配系统语言。包内共3个文件大小仅6KB包含两个用于描述向导栏分组与命令分类映射的XML文件以及一个负责界面文字和图标的DLL资源文件。使用时将全部文件释放至程序目录下的ArxAddInWiz文件夹即可覆盖原有资源使图标与菜单恢复正常同时保留完整的中文提示信息。资源整体小巧无需额外编译或注册适合已具备一定ObjectARX基础、正在维护或升级AutoCAD插件开发环境的中级开发者。目前已有451人学习下载说明该配置问题并非个例。参照作者给出的目录放置文件可快速修复工具条显示异常避免因环境问题干扰插件开发进度。1. 安装 ObjectARX 的 zh-chs 包为什么装完 SDK 你还得再补一刀做 AutoCAD 二次开发的人十有八九卡在这一步SDK 装好了VS 里向导也出来了一编译却提示找不到acedCmd或者弹出来的对话框全是英文又或者代码里一写中文字符串就乱码。问题多半不在 SDK 本身而在你漏装了 zh-chs 这个本地化资源包。ObjectARX 的 zh-chs 包不是中文说明书它是 SDK 的中文资源与多字节字符支持组件直接决定你编译出来的 ARX 能不能在中文版 AutoCAD 里正常显示对话框、正确处理中文字符串。这篇文章就围绕这个包的安装与验证把环境准备、安装顺序、路径设置和常见翻车点一次讲透。2. 先分清 ObjectARX SDK 与 zh-chs 包的边界它们各管哪一段2.1 SDK 主程序管编译zh-chs 包管本地化与字符集ObjectARX 是 AutoCAD 官方提供的 C 二次开发接口本质是一套头文件、库文件和编译工具链。你从 Autodesk 官网下载的 ObjectARX SDK 压缩包解压后能看到inc、lib、utils、docs等目录。inc里是几千个头文件lib里对应不同 AutoCAD 版本的导入库utils里有AdskAutodeskInstaller和ObjectARXWizard等工具。zh-chs 包全称是 ObjectARX for AutoCAD 简体中文语言包下载下来通常是一个独立的 zip体积不大里面只有少量文件一般是Resource.dll、*.res资源文件和一个ReadMe.txt。它的作用有两个层面让 ObjectARX 向导生成的项目模板Wizard显示中文界面方便不习惯英文界面的开发者。更重要的是它提供了 MFC 风格对话框的中文资源以及多字节字符集MBCS与 Unicode 之间的转换支持。如果你开发的 ARX 要在中文版 AutoCAD 里运行而你的对话框资源是英文的运行时你会发现按钮、标签全部英文甚至字体渲染出现方块——因为 ARX 的对话框资源编译时是跟着 SDK 的语言资源走的。2.2 版本对应关系zh-chs 必须匹配 SDK 主版本这里有个最容易踩的坑zh-chs 包的版本必须和 ObjectARX SDK 主版本完全一致。比如你下载的 SDK 是 ObjectARX 2024那 zh-chs 包也得是 2024 版。混用会发生什么最常见的是AdlmResource.dll加载失败或者向导生成的项目编译时报C1083: Cannot open include file: rxregsvc.h——这个报错和头文件缺失无关而是 SDK 的本地化层初始化失败导致后续所有包含路径失效。判断版本是否匹配的方法是看压缩包文件名。官方命名习惯一般是ObjectARX_2024_zh-chs.zip或ObjectARX_for_AutoCAD_2024_Simplified_Chinese.zip。解压后读一下里面的ReadMe.txt开头会写 This package contains the Simplified Chinese resources for ObjectARX 2024 SDK 之类的声明。如果你是在第三方站点下载的没有 ReadMe那就用文件日期和目录结构做交叉验证——匹配的 zh-chs 包解压后的目录结构一定和 SDK 主包的inc、lib结构对应不存在一个全球化资源包塞进任何版本都能用的情况。2.3 安装目录的前后关系先主包后语言包常见的做法是先解压主 SDK再解压 zh-chs 包然后把 zh-chs 包里的文件覆盖到 SDK 对应目录。但覆盖不是无脑拷贝需要按下面顺序操作把 ObjectARX SDK 主包解压到一个路径固定的目录例如E:\Autodesk\ObjectARX_2024。注意这个路径里不能有中文或空格否则后续 VS 的属性表配置会出问题。解压 zh-chs 包你会看到它里面有inc和lib两个子目录版本不同可能略有差异。把这两个目录下的文件分别复制到 SDK 主包的inc和lib里出现同名文件时选择覆盖。额外检查一下lib目录下有没有acad.res或AcDbMfcRes.res这类资源文件。zh-chs 包的核心就是这些.res文件它们是编译 ARX 程序时嵌入到 DLL 里的对话框资源。如果拷贝后lib目录里找不到它们就说明你装的不是 zh-chs 包而是某个精简版。这里补一句关键说明acad.res不是 AutoCAD 运行时要加载的资源它是编译链接时用的输入文件。链接器把 ARX 程序里IDOK、IDCANCEL这些标准控件 ID 对应的资源内容以被链接的方式写进你的 ARX DLL。链接过程如下面代码所示#pragma comment指令会强制链接器把资源文件带进来// 在 stdafx.h 或项目主头文件里 #ifdef ARX_ZH_CHS #pragma comment(linker, /include:__acad_res_zh_chs) #endif那这个include:指令又是怎么和.res文件关联的其实这里的pragma comment是配合资源脚本工作的。.res是已经编译过的二进制资源它在生成时由 RC 编译器读入.rc文件。如果你用的是 Visual Studio 的向导工程向导会自动把.res文件加到链接输入里你不需要手动敲。唯一的例外是当你用 CMake 或 qmake 构建 ARX 工程时必须自己把.res路径写进链接器输入列表否则编出来的 DLL 里没有标准对话框资源运行时 MFC 对话框会退化成一个光秃秃的窗口。3. 安装前的环境准备Visual Studio 版本与 AutoCAD 版本的三方匹配3.1 对照表AutoCAD 版本、ObjectARX 版本、VS 版本三者必须对齐ObjectARX 不是装了就能用的库它对编译器版本极其敏感。每个 AutoCAD 版本从 R18 开始绑定一个特定的 Visual Studio 版本你用 VS2019 编译 ObjectARX 2020 的代码没问题但拿去编译 ObjectARX 2022 的 SDK 就会报一堆C2338静态断言错——因为 SDK 里的#if检查了_MSC_VER编译器主版本不匹配直接拒绝编译。三者的匹配关系我用一张表列清楚这是经实际工程验证过的组合不是官方文档的完整勘误表AutoCAD 版本ObjectARX 主版本Visual Studio 版本平台工具集2016ObjectARX 2016VS2012v1102018ObjectARX 2018VS2015v1402020ObjectARX 2020VS2017v1412022ObjectARX 2022VS2019v1422024ObjectARX 2024VS2022v143这里有个重要细节表里写的是建议 VS 版本不是唯一可用版本。实际中如果你用 VS2022 打开 ObjectARX 2020 的工程编译会通过但产生的 ARX 在 AutoCAD 2020 里 load 时会报AcRxDynamicLinker错误原因是 MFC 运行时库版本不一致。所以我的建议是严格按表里的版本来别因为本机只装了新版 VS 就硬往上凑。3.2 环境变量与目录结构别让路径成为第一个翻车点确认好版本后开始配置环境变量。ObjectARX 的构建依赖几个关键的宏ACAD_VER、ARX_SDK_PATH和MFC_INCLUDE_PATH。这几个宏通常在ObjectARXWizard生成的属性表.props里定义不需要你手动设系统环境变量。但有一个东西必须手动把 SDK 的inc目录加到 Visual Studio 的包含目录里。做法如下打开 VS选择项目 → 属性 → VC 目录在包含目录里填E:\Autodesk\ObjectARX_2024\inc在库目录里填E:\Autodesk\ObjectARX_2024\lib。如果你已经用向导生成了工程这两项会被自动填好不需要改。不过这里有一个隐性坑向导生成的属性表里写的是相对路径比如..\..\ObjectARX_2024\inc。如果你的工程文件放在E:\Projects\MyArxApp\而 SDK 在E:\Autodesk\ObjectARX_2024\inc相对路径算出来是..\..\Autodesk\...一旦你把工程挪到别的机器上路径就全断了。我在实际项目中遇到过三次这种问题后面统一改成绝对路径并把 SDK 固定安装在每台机器同一个盘符路径下才彻底解决。安装 zh-chs 包之前最好先确认 SDK 主包解压后的lib目录里有没有rxapi.lib这个文件。这是一个几乎不可能出错的文件每个版本都有。如果它不存在说明 SDK 解压不完整此时装语言包是白费功夫。用命令行确认一下# 在 Windows 的 CMD 里执行 where /R E:\Autodesk\ObjectARX_2024 rxapi.lib # 或者用 PowerShell Get-ChildItem -Path E:\Autodesk\ObjectARX_2024\lib -Filter rxapi.lib -Recurse命令输出会显示找到该文件的完整路径。如果下面返回路径就继续如果没有任何输出回到第 2 章重新解压主包。3.3 zh-chs 包的解压方式别用系统自带 zip 解压工具zh-chs 包虽然小但解压方式有讲究。官方提供的 zip 压缩包里包含一个隐藏的__MACOSX目录这是在 macOS 上打包时残留的元数据目录如果你用 Windows 自带解压功能这个目录里的.DS_Store文件会混进 SDK 目录导致阳光过后 VS 的 IntelliSense 误扫出错误。而且有些版本的语言包里文件名包含非 ASCII 字符Windows 自带解压遇到代码页问题会直接把文件名替换成乱码。建议用 7-Zip 或 Bandizip 解压并勾选保留文件路径中的特殊字符选项。解压后先不要急着拷贝先看 ReadMe 里是否包含下面这段结构的说明ObjectARX_2024_zh-chs\ inc\ lib\ docs\如果你看到的目录结构里docs目录是空文件夹没关系但如果lib目录是空的那这个包就废了。正常情况下lib下应该有至少一个.res文件比如acad.mnus资源以及一个acad.rx文件——这两个文件共同确保 ARX 在运行时的 MFC 对话框能切到中文资源。4. 正式安装 zh-chs 包三步拷贝 一个注册表验证点4.1 覆盖拷贝不是把文件放进去就完事把 zh-chs 包解压后打开它的inc目录会看到若干个头文件其中必须有adui.h或aduiPort.h。这两个头文件是负责 UI 资源加载的普通英文版 SDK 里也有但那是英文资源版本zh-chs 包里的版本会把_T(OK)这种硬编码字符串映射成_T(确定)。把这个目录下的所有.h文件拷贝到 SDK 的inc目录出现同名文件就覆盖。然后处理lib目录这里最关键。把lib目录下的.res文件拷贝到 SDK 的lib目录如果你看到同名.res文件直接覆盖。为什么强调覆盖因为 SDK 主包里本来就有一个英文版的资源文件不覆盖的话链接时链接器会优先读取读普通英文资源zh-chs 包不会生效。接着是docs目录zh-chs 包里如果有文档也一并复制过去。这个文档是中文版的开发指南跟安装关系不大但可以在你后续查 API 时提供对照。最后验证一下文件夹内是否出现了新的lib\acad.res文件。用下面的命令确认时间戳是否刚刚更新dir E:\Autodesk\ObjectARX_2024\lib\acad.res文件时间如果是当前时间说明拷贝成功。如果系统提示找不到文件说明你的 SDK 版本和 zh-chs 包版本不一致zh-chs 包里根本没有对应文件需要回去核对版本。4.2 注册表验证确认语言包已被系统识别拷贝完成后zh-chs 包并不需要运行安装程序它不写注册表。但 ObjectARX 向导生成的代码在编译时会读取一个注册表项来判断当前 SDK 的语言环境。打开regedit定位到这个键HKEY_LOCAL_MACHINE\SOFTWARE\Autodesk\ObjectARX\版本号\AcDb:language正常情况下这个值应该是ResourceDll或者zh-CN。如果注册表里没有这个键可以手动创建在ObjectARX\版本号节点下新建一个字符串值命名为Language数值写zh-CN。这个操作不是官方要求的但我实测下来不建这个键的情况下ARX 程序在 AutoCAD 里加载时虽然能运行但用acedRegCmds-addCommand注册的命令名如果带中文命令行会显示乱码。建好这个键后乱码问题消失了原因应该是 AutoCAD 在启动 ARX 时用这个键值做了字符串编码切换。注册表这个操作有一个注意点32 位和 64 位 AutoCAD 的注册表路径不同。64 位 AutoCAD 跑在 64 位系统上路径不变如果你用的是 32 位 AutoCAD 却装在 64 位系统上路径会在Wow6432Node节点下HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Autodesk\ObjectARX\版本号改错地方的话验证时发现没生效别怀疑 zh-chs 包的问题先看你查的是哪个注册表分支。4.3 配置向导模板让新项目默认使用中文资源zh-chs 包安装后如果你用的是 ObjectARXWizard 生成工程模板还有一个步骤要做——在 VS 的已安装的模板中找到 ObjectARX 项目向导右键选择重新加载模板。这一步不是必须因为向导模板本身读的是 VS 的.vstemplate文件和 zh-chs 包没有直接关系。但有一个地方和 zh-chs 直接相关向导的最后一个配置页会让你选择资源语言默认是英语。选成简体中文后向导生成的.rc文件里#pragma code_page(936)会自动写上这样你在资源编辑器里输入的汉字才会正常保存。如果这里漏选了走完向导后你手动改.rc文件也可以把文件头部的#pragma code_page(936)补上再把语言声明改成LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED。这一步是很多老手都容易忽略的细节——zh-chs 包不会自动帮你把工程的资源脚本语言切中文它只是提供了可供链接的中文资源库工程本身的.rc配置文件还得你手动改。5. 避坑指南 装完 zh-chs 包后最常见的五个翻车现场5.1 编译错误C1083: Cannot open include file: aced.h但 aced.h 明明存在现象所有包含路径都配置正确aced.h确实在 SDK 的inc目录里但编译报错找不到。原因这不是文件缺失而是.rc文件在预处理时进入了错误的分支。zh-chs 包安装后aced.h内部的#ifdef依赖一个宏ARX_ZH_CHS当你用中文资源编译时向导会在预处理器定义里加上ARX_ZH_CHS。如果你是用已有工程改造的没有这个宏aced.h里的声明会被#ifndef跳过看起来就像头文件不存在。解决在项目属性 → C/C → 预处理器 → 预处理器定义里加上ARX_ZH_CHS。重新编译前关掉 VS 的 IntelliSense 缓存它有时候会缓存之前失败的状态。5.2 ARX 加载成功但对话框按钮是英文现象运行ARXLOAD后自定义命令能执行但弹出的向导对话框里按钮文字是OK、Cancel不是确定、取消。原因链接时链接器优先使用了 SDKlib目录里的英文.res而 zh-chs 包里的中文.res没有被链接输入。这和安装顺序无关而是链接器的解析顺序问题如果工程里同时引用了多个.res文件先出现的那个被优先采用。解决在项目属性 → 链接器 → 输入 → 附加依赖项里把acad.res的路径往前移放在其他.res之前。如果工程里多个.res是通过#pragma comment带进来的检查所有#pragma comment(linker, ...)指令把 zh-chs 的.res放在最后一个头文件包含之后。5.3 汉字乱码命令行和对话框里显示成?或方块现象非 Unicode 版的 ARX 程序在 AutoCAD 命令行输出中文全部变成?。原因ARX 程序编译时用了不匹配的字符集设置。AutoCAD 从 2007 版以后内部字符串是 UTF-16如果你在 VS 里选了使用多字节字符集char*的字符串是 GBK 编码传给 AutoCAD 的acedCommand时AutoCAD 按 UTF-16 解析自然乱码。解决把项目字符集改成使用 Unicode 字符集。如果你的代码里大量使用了char*可以在传参前做一次MultiByteToWideChar转换。我在实际工程里写过这样一个工具函数// 把 GBK 的 char* 转成宽字符 CString用于传给 acedCommand CString Utf8ToCString(const char* utf8) { int len MultiByteToWideChar(CP_UTF8, 0, utf8, -1, nullptr, 0); CString str; if (len 0) { MultiByteToWideChar(CP_UTF8, 0, utf8, -1, str.GetBuffer(len), len); str.ReleaseBuffer(); } return str; }注意这里的CP_UTF8是写死了的如果你的工程里字符串本来就是 GBK应该用CP_ACP。这个函数的注释和命名表明它解决的是源码字符串与 AutoCAD 运行时编码不一致的问题。设好字符集后重新编译乱码就没了。5.4 链接错误LNK2001: unresolved external symbol ACRX_DEFINE_MEMBER现象工程里任何用到ACRX_DEFINE_MEMBER宏的类都报链接错误而其他代码都正常。原因这个宏展开后会产生AcRxClass的虚函数表它依赖 SDK 提供的一个特殊符号。zh-chs 包里带了一个acrxRes.cpp样例文件里面手动实现了这个符号。但它的实现引用了acrxGetResourceInstance这个函数这个函数名在英文版 SDK 里叫acrxGetResourceInstanceA在 Unicode 环境下后缀A会被忽略。如果你的预处理器里定义了_UNICODE但没定义ARX_ZH_CHS两者叠加会导致符号名不匹配找不到入口。解决确保_UNICODE和ARX_ZH_CHS同时定义或同时不定义。在 VS 属性里_UNICODE在字符集使用 Unicode时自动定义ARX_ZH_CHS需要手动加上。它们必须成对出现否则就会触发这类链接错误。5.5acad.res被杀毒软件拦截导致编译报资源错现象装好 zh-chs 包后第一次编译工程链接器报fatal error LNK1123: failure during conversion to COFF或者提示acad.res访问被拒绝。原因.res文件本质是二进制某些杀毒软件会把一些含特定模式串的.res文件误判为可疑程序。特别是acad.res里有版本信息字符串和 AutoCAD 的可执行文件格式有些相似容易触发启发式扫描。解决在杀毒软件里把 SDK 的lib目录加入白名单或者暂时关闭实时防护编译一次。编译完的 ARX 文件如果也要躲开扫描可以把输出目录设置在项目文件夹下的x64\Release里杀毒软件默认扫描%TEMP%和下载目录对工程目录相对宽松。6. 验证安装效果两个最小实验确认 zh-chs 包真的生效了安装完 zh-chs 包别急着写业务代码先用两个最小实验确认环境没问题。第一个实验是编译一个空 ARX 工程加载后调用acrxLoadModule看命令行有没有中文输出。第二个实验是验证对话框资源。这里给一个完整的低层验证代码把这两个实验合成一段// 在 acrxEntryPoint.cpp 里入口函数 SAMPLE_ARX_ENTRYPOINT 里添加 static AcRxAppModule* pModule nullptr; extern C AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt) { switch (msg) { case AcRx::kInitAppMsg: acrxDynamicLinker-unlockApplication(pkt); acrxRegisterAppMDIAware(pkt); pModule new AcRxAppModule(pkt); acedRegCmds-addCommand(LSAMPLE, LZH_TEST, LZH_TEST, ACRX_CMD_TRANSPARENT, zhTestCmd); // 这里故意用一个中文字符串做 CodePage 验证 acutPrintf(L\n中文资源加载成功当前函数名: %s, LzhTestCmd); break; case AcRx::kUnloadAppMsg: delete pModule; acedRegCmds-removeGroup(LSAMPLE); break; } return AcRx::kRetOK; }这段代码有两个关键点。第一acutPrintf的参数我用的是L开头的宽字符串这是为了匹配 AutoCAD 内部的 UTF-16 编码。如果你用的是const char*在 zh-chs 环境下反而会触发 5.3 提到的乱码问题。第二命令名ZH_TEST用了全英文字符但函数名和输出字符串是中文这就把问题拆开了命令名用英文是为了避免命令注册时的编码歧义而输出字符串用中文则测试了运行时字符转换链路。如果 zh-chs 包没生效acutPrintf的中文输出在命令行会显示为??或直接吞掉。编译这段代码用ARXLOAD加载进 AutoCAD然后命令行输入ZH_TEST。如果光标旁出现中文资源加载成功这句话那么 zh-chs 包的所有核心组件已经完整工作可以开始写正式的 CAD 工具了。最后说一个我的个人习惯把 zh-chs 包的安装步骤写进项目的README第一页包括 SDK 解压路径、VS 版本和字符集三项。这不是给后来人看的是给自己看的。半年后当你重新拉工程代码时VS 更新了几个版本AutoCAD 又换了一轮你早就忘了当时用的 VS2019 还是 VS2022。到时候翻到这一页照着装一遍半小时就能回到开发状态。这个习惯让不少打算放弃 ObjectARX 的朋友坚持了下来希望帮到你。本文还有配套的精品资源点击获取