远程注册表访问
一种实用实现
本文是 Brian Venn 的文章 利用远程注册表访问(developerWorks,2002 年 1 月)的后续。本文不需要 InstallShield 就可以启用注册表查询(正如 Brian Venn 原先所描述的那样),这看起来是个不错的想法。用于注册表操作的所有函数都包含在 Windows API 中,所以这看起来是个试用部分 Windows API 的理想机会。
必要的函数
要启用远程注册表操作,必需实现两个函数:对远程注册表读出和写入的能力。
读和写函数已经被封装进了 RegConnect DLL。该 DLL 本身隐藏了这些函数实际操作原理的复杂性,稍后我们将对此进行描述。DLL 执行实际连接/断开和读/写函数,并提供了两个易于使用的函数。
可以通过任何能够利用 DLL 的语言(如 C 或 Visual Basic)调用这些函数。要允许从 Java 环境使用 DLL,得做一些额外的工作。
清单 1、2 和 3 说明了这些函数的原型。
清单 1. C/C 原型函数
int WINAPI RegDBGetKeyValueEx(LPCTSTR MachineName, HKEY RegKey, LPCTSTR KeyName,
LPCTSTR ValueName, LPTSTR KeyValue) ;
int WINAPI RegDBSetKeyValueEx(LPCTSTR MachineName, HKEY RegKey, LPCTSTR KeyName,
LPCTSTR ValueName, LPTSTR KeyValue) ;
清单 2. Visual Basic 原型函数
Declare Function RegDBGetKeyValueEx Lib "RegConnect.dll" (ByVal MachineName As String,
ByVal RegKey As Long, ByVal KeyName As String, ByVal ValueName As String,
ByVal KeyValue As String)
As Integer
Declare Function RegDBSetKeyValueEx Lib "RegConnect.dll" (ByVal MachineName As String,
ByVal RegKey As Long, ByVal KeyName As String, ByVal ValueName As String,
ByVal KeyValue As String)
As Integer
清单 3. Java 原型函数
public native String RegDBGetKeyValueEx(String MachineName, int RegKey,
String KeyName, String ValueName) ;
注:因为函数将字符串作为调用结果返回,所以对于 Java 没有 KeyValue 参数。
public native int RegDBSetKeyValueEx(String MachineName, int RegKey, String KeyName,
String ValueName, String KeyValue) ;
公用类 GetKey 和 SetKey 定义了调用和变量。这些类可以用来调用 DLL 函数。
函数参数
对于所有语言,参数如下:
MachineName:您希望询问的机器的名称 — 如果这是一个空字符串,则询问本地机器
RegKey:您希望查询的根键值,即 HKEY_LOCAL_MACHINE
KeyName:您希望查询的键名称,即 SOFTWARE\IBM\DB2
ValueName:您希望查询的键中值的名称,即 DB2 Folder Name
对于获取键(除了 Java 函数以外):
KeyValue:在该参数中将返回键值
对于设置键:
KeyValue:您希望设置的键值
使用函数
通过用所需参数调用各个函数来实现对这些函数的调用。当调用 RegDBGetKeyValueEx 时,某些语言需要用于返回字符串的预定义存储器。如果没有预先分配这个存储器,那么,该函数可能会(并且很可能会)失败。
正如其实现的那样,RegDBGetKeyValueEx 函数仅限于返回注册表字符串(REG_SZ)和数字(DWORD)数据。还请注意,RegDBGetKeyValueEx 仅返回字符串 — DWORD 值是作为与其等价的 ASCII 数值返回的。
当使用 RegDBSetKeyValueEx 函数来创建键时,如果该键不存在,则将创建键名和键值,记住这一点很重要。如果键已经存在,则原先的值将被覆盖。还请注意,正如其实现的那样,RegDBSetKeyValueEx 将仅存储字符串值。
清单 4 显示了一个用 Visual Basic 函数封装 RegDBGetKeyValueEx 函数的示例。
清单 4. Visual Basic 示例
Function GetRegValue(szMachine$, hKey
搜索更多相关主题的帖子:
注册表 访问