多版本AutoCAD动态加载Arx
另外创建一个MFC应用程序,创建一个窗口,在该窗口中选择相应的AutoCAD, 接着根据所选AutoCAD加载对应版本ARX。
1.获取autocad安装路径
- 注意:①64位操作系统注册表会重定向,RegOpenKeyEx第4个参数得加上KEY_WOW64_64KEY;②RegOpenKeyEx遍历子项时注意第2和第4参数,参考图: ③RegQueryValueEx同样得注意第6参数
完整代码如下
std::unordered_map<std::string, std::string> GetAllAutoCADInstallPaths()
{
// 定义结果映射,键为版本号,值为安装路径
std::unordered_map<std::string, std::string> installPaths;
// 打开 AutoCAD 注册表项
HKEY hKey;
LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Autodesk\\AutoCAD", 0, KEY_READ | KEY_WOW64_64KEY, &hKey);
if (lResult != ERROR_SUCCESS) return installPaths;
DWORD dwIndex = 0;
TCHAR szSubKeyName[MAX_PATH];
DWORD dwSize = sizeof(szSubKeyName);
vector<string> vecSubKey;
// 遍历子项
while ((lResult = RegEnumKeyEx(hKey, dwIndex, szSubKeyName, &dwSize, NULL, NULL, NULL, NULL)) == ERROR_SUCCESS)
{
vecSubKey.emplace_back(string("SOFTWARE\\Autodesk\\AutoCAD\\")+szSubKeyName);
++dwIndex;
dwSize = MAX_PATH;
}
vector<string> vecSubSubKey;
for (auto &strKey : vecSubKey)
{
HKEY hSubKey;
LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strKey.c_str(), 0, KEY_READ | KEY_WOW64_64KEY, &hSubKey);
if (lResult != ERROR_SUCCESS) return installPaths;
dwIndex = 0;
while ((lResult = RegEnumKeyEx(hSubKey, dwIndex, szSubKeyName, &dwSize, NULL, NULL, NULL, NULL)) == ERROR_SUCCESS)
{
vecSubSubKey.emplace_back(strKey + "\\" + szSubKeyName);
++dwIndex;
dwSize = MAX_PATH;
}
// 关闭键
RegCloseKey(hSubKey);
}
for(auto &strKey : vecSubSubKey)
{
HKEY hSubKey;
LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, strKey.c_str(), 0, KEY_READ| KEY_WOW64_64KEY, &hSubKey);
if (lResult != ERROR_SUCCESS) return installPaths;
char installPath[MAX_PATH];
char name[MAX_PATH];
DWORD size = MAX_PATH;
if(RegQueryValueEx(hSubKey, "Location", NULL, NULL, reinterpret_cast<LPBYTE>(installPath), &size) == ERROR_SUCCESS)
{
size = MAX_PATH;
RegQueryValueEx(hSubKey, "ProductName", NULL, NULL, reinterpret_cast<LPBYTE>(name), &size);
installPaths[string(name)] = string(installPath);;
}
// 关闭键
RegCloseKey(hSubKey);
}
// 关闭键
RegCloseKey(hKey);
return installPaths;
}
2. 根据所选版本加载arx
AutoCAD 提供了一系列启动参数,允许用户在启动应用程序时配置其行为。这些参数可以在命令行中使用,以便控制 AutoCAD 的启动选项、加载特定文件、设置工作空间、指定用户配置文件等。以下是一些常见的 AutoCAD 启动参数:
- "/b": 指定启动时要运行的脚本文件。例如,"/b script.scr" 启动 AutoCAD 并执行 script.scr 脚本。
- "/ld": 加载指定的 ARX 或 DBX 插件。例如,"/ld myplugin.arx" 在启动时加载 myplugin.arx 插件。
- "/nologo": 启动时禁用欢迎屏幕(启动画面)。
- "/nossm": 禁用用户配置文件的同步。
- "/profile": 指定要使用的用户配置文件。例如,"/profile MyProfile" 启动 AutoCAD 并使用名为 MyProfile 的配置文件。
- "/product": 指定要启动的 AutoCAD 产品。例如,"/product ACAD" 启动 AutoCAD 标准产品。
- "/startup": 指定启动后要运行的 LISP 文件。例如,"/startup startup.lsp" 启动 AutoCAD 并在启动后运行 startup.lsp 文件。
- "/reset": 重置 AutoCAD 配置设置为默认值。
- "/safemode": 启动 AutoCAD 时,启用安全模式。
- "/run": 在启动时运行指定的命令。例如,"/run mycommand" 启动 AutoCAD 并运行 mycommand。
- "/p": 指定要加载的用户配置文件。例如,"/p MyConfig" 启动 AutoCAD 并加载 MyConfig 配置文件。
- "/c": 指定要运行的指定命令。例如,"/c mycommand" 启动 AutoCAD 并运行 mycommand。
- "/s": 指定支持目录的启动参数。例如,"/s path_to_directory" 将指定的目录作为支持目录添加到 AutoCAD 中。
这些参数可以通过在命令行中输入 AutoCAD 的启动命令后紧接着添加参数来使用,例如
"Path\to\AutoCAD.exe" /nologo /ld "myplugin.arx"
所以对应arx,可由上诉方式加载。
另外也可通过acad.lsp来实现加载,只需将acad.lsp所在目录添加到支持目录即可
"Path\to\AutoCAD.exe" /s "Path\to\Support\Directory1;Path\to\Support\Directory2"
在c++代码中通过调用以上bat命令,即可实现动态加载arx。而且只有从当前exe启动才会加载对应的ARX,这样就不会打乱cad的工作环境。还可以将咱们得插件独立化,可以进一步单独创建快捷方式。
THE END
0
二维码
打赏
海报
多版本AutoCAD动态加载Arx
另外创建一个MFC应用程序,创建一个窗口,在该窗口中选择相应的AutoCAD, 接着根据所选AutoCAD加载对应版本ARX。
1.获取autocad安装路径
注意:①64位操作系统……