用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
谢谢分享,非常强大。只是我运行时出现了错误。(setq svr (vlax-invoke WMI 'CONNECTSERVER))这句说时实参太少。为什么呢? 谢谢分享 我爱高飞鸟 附件似乎无法下载,其它帖子正常。。。 本帖最后由 xiaxiang 于 2013-5-23 09:17 编辑
似乎还是不行,其它帖子是好的。不知道别人是否能下到?
已经正常,感谢高飞鸟! 太深了,粗看了一下,希望自己有机会能运用上 顶一下,正用得上。有码就是妈啊。 见一个收藏一个 看不懂呢? 不错,支持 用上了,很好
高飞鸟真棒!!!!
页:
[1]
2