我正在寻找一种干净的方法来检查是否存在注册表项.我曾经认为RegOpenKey如果我试图打开一个不存在的密钥会失败,但事实并非如此.
我可以使用字符串处理来查找并打开我正在寻找的那个的父键,然后枚举该键的子键以查明我感兴趣的那个是否存在,但这感觉就像一个性能猪和一种奇怪的方式来实现这样一个简单的功能.
我想你可以用RegQueryInfoKey这种方式,但MSDN并没有提供太多的细节,即使它是可能的.
更新:我需要Win32 api中的解决方案,而不是托管代码,.NET或任何其他库.
MSDN中的文档似乎表明您应该能够打开一个读取权限的密钥,如果它不存在则会收到错误,如下所示:
lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey);
if (lResult != ERROR_SUCCESS)
{
if (lResult == ERROR_FILE_NOT_FOUND) {
Run Code Online (Sandbox Code Playgroud)
但是,ERROR_SUCCESS当我尝试这个时,我得到了.
更新2:我的确切代码是这样的:
HKEY subKey = nullptr;
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey);
if (result != ERROR_SUCCESS) {
Run Code Online (Sandbox Code Playgroud)
......不过result是ERROR_SUCCESS,即使我试图打开一个不存在的关键.
更新3:看起来你们是对的.这在一个特定的测试示例(神秘地)上失败了.如果我在任何其他键上尝试它,它会返回正确的结果.使用注册表编辑器仔细检查它仍然不显示密钥.不知道该怎么做.
我有兴趣使用API间谍/劫持来实现我正在研究的项目的一些核心功能.在这个问题中也提到过,但这不是真正的话题,所以我认为对于这个问题它会有更好的问题.
我想尽可能多地收集关于这些,不同技术/库(MS Detours,IAT修补)或其他建议的信息.
此外,了解某人是否有使用此类技术的真实生产经验会特别有趣 - 它们是否可以为生产代码提供足够的稳定性,还是这种严格的研究技术?它是否适用于多个版本的Windows?它有多容易出错?
个人经历和外部链接都受到赞赏.