确定注册表项是否包含注册表值或子项的最佳方法是什么?

What is the best way to determine if a registry key contrains registry values or subkeys?

我编写了一个程序,它在 Windows 注册表中创建了以下子项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList

我写了第二个程序,它撤销了我第一个程序所做的事情。第二个程序必须在删除子项之前检查该子项是否包含更多子项或值。如果子项不包含其他子项或值,则子项将被删除。

如何检查子项是否包含任何子项或值?

使用RegQueryInfoKey():

Retrieves information about the specified registry key.

在它可以输出的众多不同的参数中,有以下两个对你有用的参数:

lpcSubKeys [out, optional]
A pointer to a variable that receives the number of subkeys that are contained by the specified key. This parameter can be NULL.

lpcValues [out, optional]
A pointer to a variable that receives the number of values that are associated with the key. This parameter can be NULL.

话虽如此,请注意,如果指定的键有任何子键,RegDeleteKey() 将失败,但如果它有任何值,则不会。所以你真的根本不需要检查子键是否存在,只需要检查值。如果没有值,让函数正常失败。

一个更简单的解决方案是改用 SHDeleteEmptyKey(),如果键有任何子键或值,这将失败。那就完全不用手动检查了