马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
 - ;; ------------------------------------------------------------------------
- ;;; 函数名称 / function name: XD::INIT:PRODKEY
- ;;;
- ;;; 【功能说明 / description】
- ;;; 该函数用于获取 AutoCAD 产品的 **注册表键(Product Key)**。它尝试通过多个方式查找和设置产品的注册表键。
- ;;; 包括使用 AutoCAD 环境提供的 API、读取注册表和根据文件路径查找。
- ;;;
- ;;; 【参数说明 / parameters】
- ;;; 无直接输入参数。
- ;;;
- ;;; 【局部变量 / locals】
- ;;; LOC - 存储 `acad.exe` 可执行文件的路径。
- ;;; KEY - 存储注册表键路径。
- ;;; LST - 存储注册表子键的列表。
- ;;; N - 用于遍历注册表子键的索引。
- ;;; CNT - 注册表子键的数量。
- ;;; X - 存储当前遍历的注册表子键。
- ;;; A - 用于存储中间的注册表键路径或产品路径。
- ;;;
- ;;; 【返回值 / return value】
- ;;; 返回 AutoCAD 的产品 **注册表键** `XD:PRODKEY`,如果无法确定产品键,返回 `NIL`。
- ;;;
- ;;; 【实现逻辑 / implementation logic】
- ;;; 1. 如果 `xd:prodkey` 已经存在,直接返回该值。
- ;;; 2. 尝试通过 `ACET-REG-MACHINE-PRODKEY` 获取产品注册表键,并存储在 `XD:PRODKEY` 中。
- ;;; 3. 尝试使用 COM 对象(如果可用)通过 `VLAX-MACHINE-PRODUCT-KEY` 获取产品注册表键。
- ;;; 4. 如果以上方法都没有成功,尝试从注册表中查找 AutoCAD 安装路径:
- ;;; - 使用 `acad.exe` 文件的路径。
- ;;; - 构建注册表路径并读取子键信息,检查与安装路径匹配的条目。
- ;;; - 如果找到匹配项,将产品注册表键存储在 `XD:PRODKEY` 中。
- ;;; 5. 如果仍然无法确定产品注册表键,输出错误信息并返回 `NIL`。
- ;;;
- ;;; 【示例 / example】
- ;;; (XD::INIT:PRODKEY)
- ;;; 该调用尝试获取并返回 AutoCAD 的产品 **注册表键**。
- ;;;
- ;; ------------------------------------------------------------------------
- (defun XD::INIT:PRODKEY (/ LOC KEY LST N CNT X A)
- (cond
- ;; 如果已经有 xd:prodkey,直接返回该值
- (xd:prodkey)
-
- ;; 尝试通过 ACET-REG-MACHINE-PRODKEY 获取产品注册表键
- (XD::REG:PRODKEY (setq XD:PRODKEY (ACET-REG-MACHINE-PRODKEY)))
-
- ;; 尝试通过 COM 接口获取产品注册表键
- ((and (vl-load-com) (vlax-machine-product-key))
- (setq XD:PRODKEY (vlax-machine-product-key))
- )
-
- ;; 尝试从注册表中查找 AutoCAD 安装路径来确定产品注册表键
- ((and (not (setq XD:PRODKEY (vl-bb-ref 'xd:prodkey)))
- (setq LOC (findfile "acad.exe"))
- (setq LOC (xstrcase (substr LOC 1 (- (strlen LOC) 8))))
- )
- (setq A "HKEY_LOCAL_MACHINE\\Software\\Autodesk\\AutoCAD\\")
- (setq KEY (strcat A "R" (getvar "acadver") "\\"))
- (setq LST (vl-registry-descendents KEY))
-
- ;; 如果未找到子键,尝试以不同的版本号查找
- (if (not LST)
- (progn (setq KEY (strcat A "R" (rtos (atoi (getvar "acadver")) 2 1) "\\"))
- (setq LST (vl-registry-descendents KEY))
- )
- )
-
- ;; 遍历注册表子键列表
- (setq CNT (length LST))
- (setq N 0)
- (while (and (< N CNT))
- (setq X (nth N LST))
- (setq A (strcat KEY X))
- (setq A (vl-registry-read A "AcadLocation"))
-
- ;; 如果找到匹配的路径,设置产品注册表键
- (if (and A (setq A (xstrcase A))
- (or (= A LOC) (= (strcat A "\\") LOC)))
- (progn (setq XD:PRODKEY (strcat (substr KEY 20) X)) (setq N CNT))
- )
-
- (setq N (+ N 1))
- )
-
- ;; 存储产品注册表键到缓存
- (vl-bb-set 'xd:prodkey XD:PRODKEY)
- )
-
- ;; 如果仍未找到产品注册表键,输出错误信息
- ((not XD:PRODKEY)
- (princ "\n**XDrx Tools** - Unable to determine the product key.")
- )
- )
-
- ;; 返回产品注册表键
- XD:PRODKEY
- )
|