多版本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
分享
二维码
打赏
海报
多版本AutoCAD动态加载Arx
另外创建一个MFC应用程序,创建一个窗口,在该窗口中选择相应的AutoCAD, 接着根据所选AutoCAD加载对应版本ARX。 1.获取autocad安装路径 注意:①64位操作系统……
<<上一篇
下一篇>>