找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 96|回复: 0

[系统] XD::INIT:PRODKEY

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2025-5-14 10:15:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
  1. ;; ------------------------------------------------------------------------
  2. ;;; 函数名称 / function name: XD::INIT:PRODKEY
  3. ;;;
  4. ;;; 【功能说明 / description】
  5. ;;;     该函数用于获取 AutoCAD 产品的 **注册表键(Product Key)**。它尝试通过多个方式查找和设置产品的注册表键。
  6. ;;;     包括使用 AutoCAD 环境提供的 API、读取注册表和根据文件路径查找。
  7. ;;;
  8. ;;; 【参数说明 / parameters】
  9. ;;;     无直接输入参数。
  10. ;;;
  11. ;;; 【局部变量 / locals】
  12. ;;;     LOC      - 存储 `acad.exe` 可执行文件的路径。
  13. ;;;     KEY      - 存储注册表键路径。
  14. ;;;     LST      - 存储注册表子键的列表。
  15. ;;;     N        - 用于遍历注册表子键的索引。
  16. ;;;     CNT      - 注册表子键的数量。
  17. ;;;     X        - 存储当前遍历的注册表子键。
  18. ;;;     A        - 用于存储中间的注册表键路径或产品路径。
  19. ;;;
  20. ;;; 【返回值 / return value】
  21. ;;;     返回 AutoCAD 的产品 **注册表键** `XD:PRODKEY`,如果无法确定产品键,返回 `NIL`。
  22. ;;;
  23. ;;; 【实现逻辑 / implementation logic】
  24. ;;; 1. 如果 `xd:prodkey` 已经存在,直接返回该值。
  25. ;;; 2. 尝试通过 `ACET-REG-MACHINE-PRODKEY` 获取产品注册表键,并存储在 `XD:PRODKEY` 中。
  26. ;;; 3. 尝试使用 COM 对象(如果可用)通过 `VLAX-MACHINE-PRODUCT-KEY` 获取产品注册表键。
  27. ;;; 4. 如果以上方法都没有成功,尝试从注册表中查找 AutoCAD 安装路径:
  28. ;;;    - 使用 `acad.exe` 文件的路径。
  29. ;;;    - 构建注册表路径并读取子键信息,检查与安装路径匹配的条目。
  30. ;;;    - 如果找到匹配项,将产品注册表键存储在 `XD:PRODKEY` 中。
  31. ;;; 5. 如果仍然无法确定产品注册表键,输出错误信息并返回 `NIL`。
  32. ;;;
  33. ;;; 【示例 / example】
  34. ;;;     (XD::INIT:PRODKEY)
  35. ;;;     该调用尝试获取并返回 AutoCAD 的产品 **注册表键**。
  36. ;;;
  37. ;; ------------------------------------------------------------------------

  38. (defun XD::INIT:PRODKEY (/ LOC KEY LST N CNT X A)
  39.   (cond
  40.     ;; 如果已经有 xd:prodkey,直接返回该值
  41.     (xd:prodkey)
  42.    
  43.     ;; 尝试通过 ACET-REG-MACHINE-PRODKEY 获取产品注册表键
  44.     (XD::REG:PRODKEY (setq XD:PRODKEY (ACET-REG-MACHINE-PRODKEY)))
  45.    
  46.     ;; 尝试通过 COM 接口获取产品注册表键
  47.     ((and (vl-load-com) (vlax-machine-product-key))
  48.      (setq XD:PRODKEY (vlax-machine-product-key))
  49.     )
  50.    
  51.     ;; 尝试从注册表中查找 AutoCAD 安装路径来确定产品注册表键
  52.     ((and (not (setq XD:PRODKEY (vl-bb-ref 'xd:prodkey)))
  53.           (setq LOC (findfile "acad.exe"))
  54.           (setq LOC (xstrcase (substr LOC 1 (- (strlen LOC) 8))))
  55.      )
  56.      (setq A "HKEY_LOCAL_MACHINE\\Software\\Autodesk\\AutoCAD\\")
  57.      (setq KEY (strcat A "R" (getvar "acadver") "\\"))
  58.      (setq LST (vl-registry-descendents KEY))
  59.      
  60.      ;; 如果未找到子键,尝试以不同的版本号查找
  61.      (if (not LST)
  62.        (progn (setq KEY (strcat A "R" (rtos (atoi (getvar "acadver")) 2 1) "\\"))
  63.               (setq LST (vl-registry-descendents KEY))
  64.        )
  65.      )
  66.      
  67.      ;; 遍历注册表子键列表
  68.      (setq CNT (length LST))
  69.      (setq N 0)
  70.      (while (and (< N CNT))
  71.        (setq X (nth N LST))
  72.        (setq A (strcat KEY X))
  73.        (setq A (vl-registry-read A "AcadLocation"))
  74.       
  75.        ;; 如果找到匹配的路径,设置产品注册表键
  76.        (if (and A (setq A (xstrcase A))
  77.                 (or (= A LOC) (= (strcat A "\\") LOC)))
  78.          (progn (setq XD:PRODKEY (strcat (substr KEY 20) X)) (setq N CNT))
  79.        )
  80.       
  81.        (setq N (+ N 1))
  82.      )
  83.      
  84.      ;; 存储产品注册表键到缓存
  85.      (vl-bb-set 'xd:prodkey XD:PRODKEY)
  86.     )
  87.    
  88.     ;; 如果仍未找到产品注册表键,输出错误信息
  89.     ((not XD:PRODKEY)
  90.      (princ "\n**XDrx Tools** - Unable to determine the product key.")
  91.     )
  92.   )
  93.   
  94.   ;; 返回产品注册表键
  95.   XD:PRODKEY
  96. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-6-24 12:17 , Processed in 0.353315 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表