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