1. CAXA二次开发环境搭建与项目创建
1.1 开发环境准备
CAXA二次开发需要准备以下环境组件:
- Visual Studio 2019(推荐使用专业版或企业版)
- CAXA CAD电子图板2024(需安装完整版)
- ObjectCRX开发包(通常随CAXA安装包提供)
环境配置要点:
- 安装VS2019时需勾选"C++桌面开发"工作负载
- CAXA安装路径建议保持默认(C:\Program Files\CAXA2024)
- 确认CRX开发包位于安装目录的CRX子文件夹下
注意:VS2019的版本号建议使用16.11.x以上,避免新版CAXA的兼容性问题。如果使用VS2022,需要额外配置平台工具集。
1.2 创建ObjectCRX项目
在VS2019中创建新项目的具体步骤:
- 文件 → 新建 → 项目
- 选择"Visual C++" → "CAXA" → "ObjectCRX Projects"
- 项目命名规范建议:
- 使用英文命名(如HelloWorld)
- 避免特殊字符和空格
- 路径不要包含中文
项目类型选择注意事项:
- 必须选择"Create a extension DLL(MFC shared)"
- 目标平台建议选择x64(匹配CAXA2024的默认架构)
- 不要勾选"预编译头"选项(向导已自动配置)
2. 项目结构与核心文件解析
2.1 向导生成的文件结构
code复制HelloWorld/
├── StdAfx.h // 预编译头文件
├── StdAfx.cpp // 预编译实现
├── Resource.h // 资源定义
├── CrxEntryPoint.cpp // 命令注册入口
└── CrxToolAddin.cpp // DLL主入口
2.2 关键文件功能详解
2.2.1 CrxEntryPoint.cpp
这是命令注册的核心文件,包含两个关键函数:
- On_kInitAppMsg - 模块加载时执行
cpp复制virtual AcRx::AppRetCode On_kInitAppMsg(void *pkt) {
// 必须调用父类方法
AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
// 注册命令
crxedRegCmds->addCommand(
_T("HelloApp"), // 应用组名
_T("GHello"), // 全局命令名
_T("Hello"), // 本地命令名
ACRX_CMD_MODAL, // 命令模式
&cmdHello // 回调函数
);
return retCode;
}
- On_kUnloadAppMsg - 模块卸载时执行
cpp复制virtual AcRx::AppRetCode On_kUnloadAppMsg(void *pkt) {
// 必须调用父类方法
AcRx::AppRetCode retCode = AcRxArxApp::On_kUnloadAppMsg(pkt);
// 移除命令组
crxedRegCmds->removeGroup(_T("HelloApp"));
return retCode;
}
2.2.2 CrxToolAddin.cpp
DLL入口文件,通常不需要修改:
cpp复制extern "C" HINSTANCE _hdllInstance;
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
_hdllInstance = (HINSTANCE)hModule;
return TRUE;
}
3. 编译配置与调试技巧
3.1 关键编译设置
-
包含目录配置:
- 添加CRX头文件路径:$(CAXA_DIR)\CRX\Inc
- 建议使用环境变量CAXA_DIR指向安装目录
-
库目录配置:
- 添加CRX库文件路径:$(CAXA_DIR)\bin\CAXADraft\CRX\Lib
-
输出设置:
- 目标扩展名改为.crx
- 输出目录建议设为CAXA的CRX文件夹
配置示例(VS2019属性页):
code复制C/C++ → 常规 → 附加包含目录:
$(CAXA_DIR)\CRX\Inc;$(IncludePath)
链接器 → 常规 → 附加库目录:
$(CAXA_DIR)\bin\CAXADraft\CRX\Lib;$(LibraryPath)
3.2 调试配置技巧
-
调试命令设置:
- 命令:$(CAXA_DIR)\bin\CAXADraft\CDRAFT_M.exe
- 工作目录:$(CAXA_DIR)\bin\CAXADraft
-
调试参数建议:
- 关闭"启用本地代码调试"
- 启用"使用托管兼容模式"
-
快速调试技巧:
- 使用生成后事件自动复制.crx文件
- 添加调试日志输出辅助排错
4. HelloWorld功能实现详解
4.1 命令函数实现
标准命令函数模板:
cpp复制void cmdHello() {
// 初始化CRX环境
CRX_RESULT res = CRX_OK;
// 输出到命令行
res = acutPrintf(_T("\nHello World!"));
// 错误处理
if(res != CRX_OK) {
acutPrintf(_T("\nError: %d"), res);
}
}
关键点说明:
- 必须使用acutPrintf输出到CAXA命令行
- _T宏确保Unicode兼容性
- 返回值处理是良好习惯
4.2 命令注册机制
addCommand参数详解:
cpp复制crxedRegCmds->addCommand(
_T("HelloApp"), // 命令组名称(用于分类管理)
_T("GHello"), // 全局命令名(唯一标识)
_T("Hello"), // 本地化命令名(用户输入)
ACRX_CMD_MODAL, // 命令模式
&cmdHello // 回调函数指针
);
命令模式选项:
- ACRX_CMD_MODAL:模态命令(最常用)
- ACRX_CMD_TRANSPARENT:透明命令
- ACRX_CMD_USEPICKSET:支持选择集
4.3 常见问题解决方案
问题1:命令执行无输出
可能原因:
- 未正确链接CRX库
- 缺少acutPrintf调用
- 命令未正确注册
解决方案:
- 检查链接器输入是否包含crxapi.lib
- 确认调用了acutPrintf
- 在On_kInitAppMsg中添加调试输出
问题2:模块加载失败
可能原因:
- CRX文件版本不匹配
- 依赖项缺失
- 路径包含中文
解决方案:
- 确认CAXA版本与开发环境匹配
- 使用Dependency Walker检查依赖
- 使用纯英文路径
5. 进阶开发技巧
5.1 工程组织建议
-
代码分层结构:
- Commands/:命令实现
- Utils/:工具函数
- Resources/:资源文件
-
推荐命名规范:
- 命令函数:cmd[功能名](如cmdDrawLine)
- 命令组:[AppName]Commands
- 变量:匈牙利命名法
5.2 调试输出技巧
- 日志输出宏:
cpp复制#define LOG(fmt, ...) \
acutPrintf(_T("\n[DEBUG] ") _T(fmt), ##__VA_ARGS__)
- 错误处理模板:
cpp复制CRX_RESULT res = SomeFunction();
if(res != CRX_OK) {
LOG("Error in SomeFunction: %d", res);
return;
}
5.3 性能优化建议
-
内存管理:
- 使用CAXA提供的CRX内存分配函数
- 避免频繁申请/释放内存
-
命令优化:
- 耗时操作添加进度提示
- 支持撤销/重做功能
-
异步处理:
- 长时间操作使用工作线程
- 通过消息机制更新UI
6. 项目部署与发布
6.1 生成发布版本
-
配置管理:
- 使用Release配置
- 关闭调试信息
- 开启优化选项
-
依赖打包:
- 静态链接CRT运行时
- 提供README说明依赖项
6.2 安装包制作建议
-
安装目录:
- 默认安装到CAXA的CRX文件夹
- 添加注册表项记录安装信息
-
安装程序:
- 使用Inno Setup等工具打包
- 包含版本检测功能
-
卸载支持:
- 提供完整的卸载功能
- 清理注册表和临时文件
6.3 版本兼容性处理
-
多版本支持:
- 使用条件编译区分CAXA版本
- 提供适配层处理API差异
-
运行时检测:
- 检查CAXA版本号
- 不兼容时给出友好提示
-
向后兼容:
- 避免使用新版特有API
- 提供替代实现方案