VFP 删除注册表键值!

yrt888 2013-08-13 08:14:57
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

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



...全文
227 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yrt888 2013-08-13
  • 打赏
  • 举报
回复
果然搞错 要用这个 RegDeleteValue API 问题解决了!谢谢各位!
taohua300 2013-08-13
  • 打赏
  • 举报
回复
豆老师有没有64位系统测试一下 这段代码在vfp下运行的时候能不能删除键 编译成exe后运行exe能不能删除键
yrt888 2013-08-13
  • 打赏
  • 举报
回复
可能概念有误,要删的应该是键下某项!
yrt888 2013-08-13
  • 打赏
  • 举报
回复
我的是 32位!
十豆三 2013-08-13
  • 打赏
  • 举报
回复
试试这个:
*操作注册表
*语法:
*创建子键: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
taohua300 2013-08-13
  • 打赏
  • 举报
回复
操作系统是64位的? RegCreateKey,RegOpenKey 都是为16位Windows提供兼容性的 写代码的时候要使用RegCreateKeyEx和RegOpenKeyEx RegDeleteKey在64位系统的时候可能不能删除某些键,应该使用RegDeleteKeyEx
yrt888 2013-08-13
  • 打赏
  • 举报
回复
补充 我的代码 :#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)  这里是错误的。原代码不是这样,那是为了方便提示创建了键,这样写,只是创建了键,而键的内容是不能写进去的!
yrt888 2013-08-13
  • 打赏
  • 举报
回复
这个方法不错,谢谢!不过还是想了解用 API 如何删除?谢谢!
lzw_0736 2013-08-13
  • 打赏
  • 举报
回复
函数名: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

2,723

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧