highflybir 发表于 2013-5-23 00:02:55

用StdRegProv类操纵注册表

本帖最后由 highflybir 于 2013-5-23 09:12 编辑

此问题的来源:http://bbs.mjtd.com/thread-101515-1-1.html。
说明:在很多场合,CAD要读写注册表,对于二进制内容的读写,方法种种:
    用CAD本身的函数外部程序方法: (startapp "regedit" regfile)                                 
    VLisp 的方法:

(vl-registry-read reg-key )
(vl-registry-write reg-key )
    ACET的方法:

(acet-reg-get path key)         
(acet-reg-put path key value)
   WSH   的方法:

(vlax-invoke wsh 'RegRead RegPath)   
(vlax-invoke wsh 'RegWrite RegPath Value "键值类型")         
    还有DOSLIB等等。
    这些方法都有一定的缺陷.下面的程序我用了WMI的注册表的StdRegProv类,使得程序可 以更加通用和强大.
    注: 读写注册表在一些windows上需要以管理员身份运行,可能要关闭某些杀毒软件.

(defun C:test (/ CTX DATA HKLM INPARAMS METHODS OREG OUTPARAMS SUBKEYNAME SVR SYS UVALUE WMI)
;;; 注意: 此处的lst的数据皆是不超过255的正整数,相当于把16进制转化为10进制。
(defun MakeBinaryVariant (lst / a)
    (setq a (vlax-make-safearray vlax-vbvariant (cons 0 (1- (length lst)))))
    (vlax-safearray-fill a (mapcar (function (lambda (x) (vlax-make-variant x 17))) lst))
    (vlax-make-variant a)
)
;;;判断系统是否为64位
(defun Is64Bit (/ WMI SVR SYS)
    (setq WMI (vlax-create-object "WbemScripting.SWbemLocator"))
    (setq SVR (VLAX-INVOKE WMI 'ConnectServer))
    (vlax-for n (vlax-invoke SVR 'InstancesOf "Win32_ComputerSystem")
      (setq SYS (vlax-get n 'SystemType))
    )
    (vlax-release-object SVR)
    (vlax-release-object WMI)
    (wcmatch sys "x64*")
)

(setq WMI (vlax-create-object "WbemScripting.SWbemLocator"))                              ;关于这个物体用途太多
(setq CTX (vlax-create-object "WbemScripting.SWbemNamedValueSet"))
(setq SVR (VLAX-INVOKE WMI 'ConnectServer))
(setq oReg (vlax-invoke SVR 'get "StdRegProv"))                                        ;获得注册表对象
(setq HKLM (+ 3 2147483647))                                                         ;此处不可直接写2147483650

(vlax-invoke oReg 'CreateKey hklm "Software\\MyKey1\\MySubKey1")                        ;创建项和子项
(if (Is64Bit)
    (setq subkeyName "SOFTWARE\\Wow6432Node\\MyKey1\\MySubKey1")                        ;对于64位的可能会创建在这个位置
    (setq subkeyName "SOFTWARE\\MyKey1\\MySubKey1")                                        ;对于32位的可能会创建在这个位置
)
(setq methods (vlax-get oReg 'methods_))

;;以下为在注册表中创建一个二进制的值的示例:
(setq Inparams (vlax-get (vlax-invoke methods 'item "SetBinaryValue") 'Inparameters)) ;输入参数
(vlax-put InParams 'Hdefkey HKLM)                                                      ;根键
(vlax-put Inparams 'Ssubkeyname subkeyName)                                                 ;子键
(vlax-put Inparams 'Svaluename "BinaryTest")                                                ;要创建的二进制值的名称
(setq uValue (vlax-invoke (vlax-get inparams 'properties_) 'item "uValue"))         ;二进制为uValue,字符串为sValue
(setq data (MakeBinaryVariant '(122 123 232)))                                        ;一定要转换此种数据类型,否则提示参数不匹配(数据要把16进制转为十进制)
(vlax-put-property uValue 'Value data)                                                ;此处一定要用vlax-put-property

(setq OutParams (vlax-invoke oReg 'ExecMethod_ "SetBinaryValue" Inparams nil CTX))    ;然后开始设置,修改注册表
(if (zerop (vlax-get OutParams 'ReturnValue))                                                ;返回值为0代表成功
    (alert "修改成功!")
    (alert (vlax-invoke OutParams 'GetObjectText_))
)
(vlax-release-object uValue)
(vlax-release-object OutParams)
(vlax-release-object Inparams)

;;以下为在注册表中读取二进制值的内容的示例:
(setq Inparams (vlax-get (vlax-invoke methods 'item "GetBinaryValue") 'Inparameters))
(vlax-put InParams 'Hdefkey HKLM)                                                      ;根键
(vlax-put Inparams 'Ssubkeyname subkeyName)                                                 ;子键
(vlax-put Inparams 'Svaluename "BinaryTest")                                                ;要创建的二进制值的名称
(setq OutParams (vlax-invoke oReg 'ExecMethod_ "GetBinaryValue" Inparams nil CTX))    ;然后开始读取注册表
(if (zerop (vlax-get OutParams 'ReturnValue))                                                ;返回值为0代表成功
    (princ (vlax-get Outparams 'uValue))                                                ;则返回此数据内容
    (alert (vlax-invoke OutParams 'GetObjectText_))
)

;;最好释放所创建的对象
(vlax-release-object OutParams)
(vlax-release-object Inparams)
(vlax-release-object Methods)
(vlax-release-object SVR)
(vlax-release-object CTX)
(vlax-release-object WMI)
(princ)
)

附件如下

另外:可以供读者参考的链接:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa394600(v=vs.85).aspx
http://hi.baidu.com/chinarzq/item/370b1b385c39064d033edc15

南风枕流 发表于 2023-1-1 11:38:55

谢谢分享,非常强大。只是我运行时出现了错误。(setq svr (vlax-invoke WMI 'CONNECTSERVER))这句说时实参太少。为什么呢?

229096767 发表于 2022-8-22 09:37:16

谢谢分享      

yxp 发表于 2013-5-23 01:30:00

我爱高飞鸟

xiaxiang 发表于 2013-5-23 08:30:49

附件似乎无法下载,其它帖子正常。。。

xiaxiang 发表于 2013-5-23 09:02:01

本帖最后由 xiaxiang 于 2013-5-23 09:17 编辑

似乎还是不行,其它帖子是好的。不知道别人是否能下到?

已经正常,感谢高飞鸟!

自贡黄明儒 发表于 2013-5-23 11:06:53

太深了,粗看了一下,希望自己有机会能运用上

soly2006 发表于 2013-5-23 12:59:06

顶一下,正用得上。有码就是妈啊。

gzxl 发表于 2013-5-23 13:06:11

见一个收藏一个

xiabin68 发表于 2013-5-24 00:56:06

看不懂呢?

jyzas 发表于 2013-8-10 07:10:38

不错,支持

dcl1214 发表于 2013-9-3 17:17:28

用上了,很好
高飞鸟真棒!!!!
页: [1] 2
查看完整版本: 用StdRegProv类操纵注册表