XD::INIT:PRODKEY
;; ------------------------------------------------------------------------
;;; 函数名称 / 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
)
页:
[1]