首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

VFP 剔除注册表键值

2013-08-14 
VFP 删除注册表键值!DECLARE Long RegCloseKey IN WIN32API Long DECLARE Integer RegOpenKey IN Win32API

VFP 删除注册表键值!
DECLARE Long RegCloseKey IN WIN32API Long 
DECLARE Integer RegOpenKey IN Win32API Integer nHKey, String @cSubKey, Integer @nResult
DECLARE Integer RegCreateKey IN Win32API Integer nHKey, String @cSubKey, Integer @nResult
DECLARE Integer RegSetValueEx IN Win32API Integer hKey, String lpszValueName, Integer dwReserved,Integer fdwType, String lpbData, Integer cbData
DECLARE Integer RegQueryValueEx IN Win32API Integer nHKey, String lpszValueName, Integer dwReserved,Integer @lpdwType,string @lpbData, Integer @lpcbData
DECLARE Integer RegDeleteKey IN Win32API Integer nHKey, String @cSubKey

#DEFINE HKEY_CURRENT_USER bitset(0,31)+1 &&-2147483647
csubkey='Software\测试'
nresult=0 
if regopenkey(HKEY_CURRENT_USER,@csubkey,@nresult)#0 
RegCreateKey(HKEY_CURRENT_USER,csubkey,@nresult)
llpbdata='好耶'
cbdata=len(llpbdata)
RegSetvalueEx(nresult,'键位',0,1,llpbdata,cbdata) 
ELSE
llpbdata='键位'
A=RegDeleteKey(nresult,llpbdata)
?A
ENDIF
= RegCloseKey (nresult) 

尝试删除那个 键名为 '键位' 的键,失败,提示 为 2

不知怎样删除注册表的某键 谢谢各位!




[解决办法]
函数名:regDelValue(cKey,cSubKey [,nRoot [,lShowErr]])
缩写:regv
删除注册表中的设置
返回值:
逻辑型,为真时删除成功
参数:
cKey:字符型,要删除的键值,如ProgramFilesDir 
cSubKey:字符型,分支,如SOFTWARE\Microsoft\Windows\CurrentVersion 
[nRoot]:整型,可选,注册表的要键,默认为HKEY_LOCAL_USER 
[lShowErr]:逻辑型,可选,是否产生错误,默认为否,即不产生错误。因为注册表的部分键的读取需要权限才能读取,或不存在时,都将读取失败,设置此参数为真时,将向VFP发送错误。

其中 nRoot可以取以下值,应将下面代码复制到你要使用的方: 
#DEFINE HKEY_CLASSES_ROOT 2147483648 && 0x80000000,或用负数: -2147483648
#DEFINE HKEY_CURRENT_USER 2147483649 && 0x80000001,-2147483647
#DEFINE HKEY_LOCAL_MACHINE 2147483650 && 0x80000002,-2147483646
#DEFINE HKEY_USERS 2147483651 && 0x80000003,-2147483645
#DEFINE HKEY_PERFORMANCE_DATA 2147483652 && 0x80000004,-2147483644
#DEFINE HKEY_CURRENT_CONFIG 2147483653 && 0x80000005,-2147483643


#DEFINE HKEY_DYN_DATA 2147483654 && 0x80000006,-2147483642 
示例代码
*下面代码演示了如何删除注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion下的RegisteredOwner键:

#DEFINE HKEY_CLASSES_ROOT 2147483648 && 0x80000000,或用负数: -2147483648
#DEFINE HKEY_CURRENT_USER 2147483649 && 0x80000001,-2147483647
#DEFINE HKEY_LOCAL_MACHINE 2147483650 && 0x80000002,-2147483646
#DEFINE HKEY_USERS 2147483651 && 0x80000003,-2147483645

*下面代码演示了如何删除注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion下的RegisteredOwner键:

#DEFINE HKEY_CLASSES_ROOT 2147483648 && 0x80000000,或用负数: -2147483648
#DEFINE HKEY_CURRENT_USER 2147483649 && 0x80000001,-2147483647
#DEFINE HKEY_LOCAL_MACHINE 2147483650 && 0x80000002,-2147483646
#DEFINE HKEY_USERS 2147483651 && 0x80000003,-2147483645
#DEFINE HKEY_PERFORMANCE_DATA 2147483652 && 0x80000004,-2147483644
#DEFINE HKEY_CURRENT_CONFIG 2147483653 && 0x80000005,-2147483643
#DEFINE HKEY_DYN_DATA 2147483654 && 0x80000006,-2147483642

Set Library To myFll

?regDelValue("RegisteredOwner","SOFTWARE\Microsoft\Windows NT\CurrentVersion",HKEY_LOCAL_MACHINE)

Set Library To 

[解决办法]
操作系统是64位的?

RegCreateKey,RegOpenKey 都是为16位Windows提供兼容性的
写代码的时候要使用RegCreateKeyEx和RegOpenKeyEx

RegDeleteKey在64位系统的时候可能不能删除某些键,应该使用RegDeleteKeyEx

[解决办法]
试试这个:

*操作注册表
*语法:
*创建子键:registry(0,主键序号,子键名,新建子键名)
*写注册表:registry(1,主键序号,子键名,,注册项,项目值,值类型)
*读注册表:registry(2,主键序号,子键名,,注册项)
*删除子键:registry(3,主键序号,子键名)

?registry(3,3,'Software\HAKA_test\数据库设置')&& 参数2的值3表示:HKEY_LOCAL_MACHINE

Function registry
Parameters  nReg_code,;&&操作代码,0-创建子键,1-写注册表,2-读注册表,3-删除注册表项
nReg_MainKeyNo,;       &&注册表主键序号
cReg_skey,;            &&子键
cReg_skey_New,;        &&需创建的子键
cReg_skeyname,;        &&注册表项
cReg_keyvalue,;        &&注册表项的值
nReg_ValueType         &&注册表项的值的类型,1-数据串(REG_SZ),2-Unicode 串,3-二进制(REG_BINARY),4-32-位数值(REG_DWORD)


On Error Return .F.
Local nDisposition,;
lnResult,;      &&要取得值的注册表子项的地址
nResult,;
ReturnValue,;   &&返回的注册表值
nKeyLength,;    &&要写的值的长度
Buffer,;        &&返回注册表项值
BufferSize,;    &&返回值的长度
lnError,;       &&返回注册表函数的错误代码
nError,;        &&返回的错误代码
skey1,skey2

If !Between(nReg_MainKeyNo,1,4)
Return .F.
Endif

If nReg_code=1 And !Between(nReg_ValueType,1,4)
Return .F.
Endif
nReg_MainKeyNo=nReg_MainKeyNo-2147483649
*注册表键值访问权限
#Define KEY_ALL_ACCESS             983103          &&所有权限

Declare Integer RegOpenKeyEx In Win32API ;
INTEGER nKey,;
STRING @cSubKey, ;
INTEGER nReserved,;
INTEGER nAccessMask,;
INTEGER @nResult

Declare Integer RegQueryValueEx In Win32API;
INTEGER nKey, ;
STRING cValueName, ;
INTEGER nReserved,;
INTEGER @nType, ;
STRING @cBuffer, ;
INTEGER @nBufferSize

Declare RegCreateKeyEx In WIN32API;
INTEGER hKey,;                &&一个打开项的句柄,或者一个标准项名
String lpSubKey,;             &&欲创建的新子项的名字
Integer Reserved,;            &&设为零
String lpClass,;              &&项的类名
Integer dwOptions,;           &&零,这个项不正式保存下来,系统重新启动后会消失
Integer samDesired,;          &&访问权限
Integer lpSecurityAttributes,;&&对这个项的安全特性进行描述的一个结构,零
Integer @phkResult,;          &&指定用于装载新子项句柄的一个变量
Integer @lpdwDisposition      &&返回是新建子项,还是打开子项(如果新建的子项存在)

Declare RegDeleteKey In WIN32API;
INTEGER hKey,;
STRING lpSubKey

Declare Integer RegCloseKey In Win32API Integer nKey

Declare Integer RegSetValueEx In Win32API;
INTEGER hKey,;
STRING lpValueName,;


INTEGER Reserved,;
INTEGER dwType,;
STRING  lpData,;
INTEGER cbData

Do Case
Case nReg_code=0     &&创建子建
nResult= 0
nDisposition = 0
nError = RegOpenKeyEx(nReg_MainKeyNo,cReg_sKey,0, KEY_ALL_ACCESS, @nResult)
If nError#0
Messagebox('Can`t open the sub_key!',0+48,'INF')
Return .F.
Endif
nError=RegCreateKeyEx(nResult,cReg_sKey_New,0,'nReg_ValueType',0,KEY_ALL_ACCESS,0,@lnResult,@nDisposition)
=RegCloseKey(nResult)
Return nError
**************************************************************************************
Case nReg_code=1  &&写注册表
nError=0
nError =RegOpenKeyEx(nReg_MainKeyNo,cReg_sKey, 0,KEY_ALL_ACCESS, @lnResult)
If nError#0
Messagebox('Can`t write the sub_key!',0+48,'INF')
Return .F.
Endif
nKeyLength=Len(cReg_KeyValue)
nError=RegSetValueEx(lnResult,cReg_sKeyName,0,nReg_ValueType, @cReg_KeyValue, @nKeyLength)
=RegCloseKey(lnResult)
Return nError=0
***************************************************************************
Case nReg_code=2       &&读注册表
ReturnValue = ""
lnResult = 0
Buffer = Space(128)
BufferSize = 128
lnError = RegOpenKeyEx(nReg_MainKeyNo,cReg_sKey, 0, KEY_ALL_ACCESS, @lnResult)
If lnError = 0
lnType = 0
lnError = RegQueryValueEx(lnResult, cReg_skeyname, 0, @lnType, @Buffer, @BufferSize)
If lnError = 0 And Buffer <> Chr(0)                &&如果错误码为 0, 则正常读取值.
ReturnValue = Left(Buffer, BufferSize - 1) &&取得返回值
Endif
Endif
=RegCloseKey(lnResult)
Return ReturnValue
**************************************************************************************
Case nReg_code=3        &&删除注册表项
skey1=Left(cReg_sKey,At('\',cReg_sKey,Occurs('\',cReg_sKey))-1)
skey2=Subst(cReg_sKey,At('\',cReg_sKey,Occurs('\',cReg_sKey))+1)
nError =RegOpenKeyEx(nReg_MainKeyNo,sKey1, 0,KEY_ALL_ACCESS, @lnResult)
If nError#0
Messagebox('Can`t delete the sub_key!',0+48,'INF')
Return .F.
Else
nError=RegDeleteKey(lnResult,sKey2)
Endif
Return nError
Endcase
Endfunc

热点排行