【发布时间】:2012-09-25 09:49:32
【问题描述】:
我正在使用 RegOpenKeyEx、RegDeleteKey 和 RegEnumKey 实现递归注册表删除。
问题:: 虽然代码在 Vista x86/x64 和 Win 7 x86/x64 上运行得非常好,但在 XP 上对于 HKCR 中的某些键却失败了
问题区域:: HKCR\Installer\Products\SomeKey
错误代码:: 87 (INVALID_PARAMETER)
Weird Behaviour:: 在我使用 REGEDIT 打开密钥时删除密钥。
代码::
static BOOL RcrsvRegDel( HKEY hKey, LPTSTR lpszSub )
{
BOOL bRet = TRUE ;
LONG lRet ;
DWORD dwSize = MAX_PATH ;
TCHAR szName[MAX_PATH] ;
TCHAR szFullKey[MAX_PATH * 2] ;
HKEY hKeySub = NULL ;
HRESULT hr = NULL ;
do{
lRet = RegOpenKeyEx( hKey, lpszSub, 0, KEY_ENUMERATE_SUB_KEYS | DELETE, &hKeySub ) ;
printf("RegOpenKey:: %S :: lRet = %ld\n", lpszSub, lRet) ;
if( lRet != ERROR_SUCCESS )
{
if( lRet == ERROR_FILE_NOT_FOUND )
{
bRet = TRUE ;
break ;
}
else
{
bRet = FALSE ;
break ;
}
}
while( ERROR_NO_MORE_ITEMS != (lRet = RegEnumKeyEx(hKeySub, 0, szName, &dwSize, NULL, NULL, NULL, NULL)) )
{
bRet = RcrsvRegDel( hKeySub, szName) ;
if( bRet == FALSE )
break ;
}
if( hKeySub != NULL )
{
RegCloseKey(hKeySub) ;
hKeySub = NULL ;
}
lRet = RegDeleteKey( hKey, lpszSub ) ;
printf("RegDelKey:: %S :: lRet = %ld\n", lpszSub, lRet) ;
if( lRet == ERROR_SUCCESS )
{
bRet = TRUE ;
break ;
}
}while(0) ;
return bRet ;
}
知道发生了什么吗?
更新::
我也尝试了带有以下标志的 samDesired 参数
-KEY_READ
-KEY_READ | KEY_WRITE
-KEY_ENUMERATE_SUB_KEYS
-KEY_ENUMERATE_SUB_KEYS |删除
上述标志都不起作用:-(
【问题讨论】:
-
如果使用密钥的真实路径
HKLM\Software\Classes\Installer\...会发生什么? -
@HarryJohnston- 我没试过......让我试试,我会告诉你结果。谢谢你的启发:-)
-
@HarryJohnston- 还是一样 :-( ERROR 87
-
再次检查输出以查看您是否已经删除了无法打开的密钥(它可能会枚举两次)。列出您要提前删除的分支的内容,并将其与输出进行比较;也许其他一些程序正在同时添加和删除键。确保您使用 Unicode 进行编译。为什么使用两个反斜杠作为路径分隔符?为什么要递归到 K7RT_RcrsvRegDel 而不是 RcrsvRegDel,它们是同一个函数吗?
-
与其将键名附加在一起形成完整路径,不如调用
RcrsvRegDel(hKeySub, szName)进行递归。
标签: c++ windows winapi mfc registry