/读取注册表中的值
RegistryGet("HKEY_CURRENT_USER\Software\Microsoft\abc","SERVER_NAME",RegString!,str_server)
//设置注册中的值
RegistrySet("HKEY_CURRENT_USER\Software\Microsoft\abc","SERVER_NAME",RegString!,str_server)
====================================================
一、注册表相关知识
1、了解几个与注册表相关的关键字
了解这几个关键字将有助于更清晰的理解函数的作用,以及下文中对每个函数的解释。
Key(键):在PB与注册表相关的函数中,都有一个key参数,指的是注册表中的从根键开始的键值,如下图中最下方的方框中的数据。
Subkey(子键)
Value item(键值项):指某一键的具体参数;每个键值项都有键值项名称(valuename)、键值项类型(valuetype)及键值项数据(value)三部分内容。每一个键都会有一个默认的键值项和一个或多个命名的键值项。
2、注册表中常用的数据类型
在下表中列出了注册表中常用的数据类型,即与函数中valuetype相对应的内容。它有助于了解PB函数中valuetype这个枚举型的参数。
类型 说明
REG_BINARY 可以包含任何数据的二进制对象颜色描述
REG_DWORD DWORD值
REG_DWORD_BIG_ENDIAN 一个DWORD值的逆序存储形式
REG_DWORD_LITTLE_ENDIAN DWORD值
REG_EXPAND_SZ 包含环境变量占位符的字符串
REG_LINK 命名一个符号链接(symbolic link)的Unicode串
REG_MULTI_SZ 以null字符分隔的字符串集合,集合中的最后一个字符串以两个null字符结尾
REG_SZ 以null字符分隔的字符串
表1:注册表中常用的数据类型:
二、PB中的注册表操作函数
在PB中,与注册表相关的函数一共有五个,利用这些函数,可以进行对系统注册表数据的读写操作,实现对注册表编程的需求。这五个函数分别是:
RegistryGet:用来得到某个键的一个键值项的键值项数据。即上图中右侧‘数据’部分中的内容
RegistrySet:为键或键的键值项赋值或者创建一个新的键或键值项。
RegistryKeys:得到某键的子键
RegistryValues:得到某键的各键值项的名称,即上图中‘名称’部分中的内容
RegistryDelete:删除某些键或键值项
首先说明一个在上述五个函数中都必须的一个参数:key:
key是字符串型数据,保存的是要对其进行操作的键,例如上图中状态框中‘HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE’这部分内容。为保证键值的唯一性,必须从根键开始写起,直到要用到的子键的键名都要按上面的方式写出来,并以斜线分开各子键。
RegistryGet
语法:RegistryGet ( key, valuename, { valuetype }, valuevariable )
参数
类型
说明
ValueName
String
键值项名称,即上图中‘名称’部分的内容。每个键都会有一个没有命名的键值项和几个命名的键值项,对于没有命名的键值项,须指定一个空的字符串。
Valuetype
枚举
指明‘ValueName’所指的键值项的数据类型。共有七种:RegString!、RegExpandString!、RegBinary!、ReguLong!、ReguLongBigEndian!、RegLink!和RegMultiString!。它们是和上图中‘类型’这一部分相对应的。见表1
Valuevariable
不定
与‘valuetype’相匹配的数据类型用来存储取出的键值。
返回值:当成功时返回1,失败是返回-1。
一般情况下,失败的原因是‘valueType’和‘Valuevariable’两者的类型不匹配,或者‘valuetype’和注册表键值的数据类型不匹配。
实例:获得某软件的安装目录
例如在上图中,若想取出ORACLE的安装目录,则可进行如下的操作:
string ls_orasysdir
integer li_rtn
li_rtn=registryGet('HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE','ORACLE_HOME',Regstring!,ls_orasysdir)
if li_rtn < 1 then
messagebox('error','read regedit error')
else
messagebox('value',ls_orasysdir)
end if
其中,ls_orasysdir中存储的就是oracle的安装目录:e:\oracle\ora81
RegistrySet
语法:RegistrySet ( key, valuename, valuetype, value )
参数:参数中前三项与RegistryGet中的参数意义相同。
Value 是要设置的数据,同样,它必须与valuetype的数据类型相同。
返回值:同RegistryGet函数。
实例:动态设置ODBC
//将数据源名称“ex”注册到“HKEY_CURRENT_USER\software\odbc\odbc.ini\odbc data sources”下。
registryset(“HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI\ODBC DATA SOURCES”, “ex”,regstring!, “sybase sql anywhere 5.0”)
//在"HKEY_CURRENT_USER\software\odbc\odbc.ini"下新增以该数据源名称"ex"为键名的子键
registryset(“HKEY_CURRENT_USER\software\odbc\odbc.ini\ex”, “ ”,regstring!, “ ”)
//创建连接到数据源所需要的参数
registryset(“HKEY_CURRENT_USER\software\odbc\odbc.ini\ex”, “autostop”,regstring!, “yes”)
registryset(“HKEY_CURRENT_USER\software\odbc\odbc.ini\ex”, “databasefile”,regstring!, “c:\pb\ex.db”)
registryset(“HKEY_CURRENT_USER\software\odbc\odbc.ini\ex”, “databasename”,regstring!, “ex”)
registryset(“HKEY_CURRENT_USER\software\odbc\odbc.ini\ex”, “driver”,regstring!, “wod50t.dll”)
registryset(“HKEY_CURRENT_USER\software\odbc\odbc.ini\ex”, “pwd”,regstring!, “sql”)
registryset(“HKEY_CURRENT_USER\software\odbc\odbc.ini\ex”, “start”,regstring!, “dbeng50 -Q”)
registryset(“HKEY_CURRENT_USER\software\odbc\odbc.ini\ex”, “uid”,regstring!, “dba”)
Registrykeys
语法:Registrykeys(key,subkeys)
参数:
subkeys:一个字符串型的数组,用来存储需要的子键。如果该数组是变长的,则它的上限就是子键的数目;如果是固定大小的,则必须保证它的大小可用容纳所有的子键,否则的话,就无法知道,该键实际有多少个子键。
返回值:成功为1,当发生错误时失败,返回-1。
实例:得到上图中“HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE”的子键的个数及各子键。
string ls_orakey[],ls_temp
integer li_rtn,i
long ll_upper
li_rtn=registrykeys(“HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE”,ls_orakey)
if li_rtn < 1 then
messagebox('error','read regedit error')
else
ll_upper=upperbound(ls_orakey)
ls_temp='has '+string(ll_upper)+' subkeys ~t~r'
for i = 1 to ll_upper
ls_temp=ls_temp+'subkey'+string(i)+'='+ls_orakey[i]+'~t~r'
next
messagebox('subkey',ls_temp)
end if
返回结果:
has 4 subkeys
subkey1=ALL_HOMES
subkey2=HOME0
subkey3=OLEDB
subkey4=OO4O
Registryvalues
语法:Registryvalues(key,valuename)
参数:
valuename:一个字符串型的数组,用来存储需要的键值项的名称。如果该数组是变长的,则它的上限就是子键的数目;如果是固定大小的,则必须保证它的大小可用容纳所有的键值项,否则的话,就无法知道,该键实际有多少个键值项。
返回值:成功为1,当发生错误时失败,返回-1。
实例:得到上图中”HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE”键下各键值项的名称。
程序与上例相同,只需将函数变为Registryvalues,数组变为存储键值项名称的数组即可。
返回结果如下:
has 9 named values
named values1=inst_loc
named values2=ORACLE_HOME
named values3=ORACLE_HOME_NAME
named values4=API
named values5=ORACLE_GROUP_NAME
named values6=NLS_LANG
named values7=OLEDB
named values8=VOBHOME2.0
named values9=OO4O
RegistryDelete
语法:RegistryDelete ( key, valuename )
参数:
key:字符型,需删除的键,或者包含有需删除的键值项的键。
valuename:字符型,指出键值项的名称,如果所指定的键不含有子键,则可用空字符串表明删除键及其所有键值项。
返回值:同上。
实例:
该实例用来删除一个名为“Title”的键值项及其相关的数值;但键不会被删除。
RegistryDelete(“HKEY_LOCAL_MACHINE\Software\MyApp.Settings\Fonts”, “Title”)
而用
RegistryDelete( “HKEY_LOCAL_MACHINE\Software\MyApp.Settings\Fonts”, “ ”)
则可以删除该键。