newer 发表于 2025-5-14 10:15:00

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]
查看完整版本: XD::INIT:PRODKEY