我正在尝试编写一个通用API来处理Windows注册表 . 当然,我想到的第一个问题是所有的交叉32-64超额加上UAC在赢7后所构成的问题 .
在我的API中,我可以创建从64应用程序到32个注册表项的新子项,但是当我尝试删除它们时,我遇到了几个问题 .
例如,我的“创建或返回子键(如果存在)”功能如下所示:
Registry::SubKey Registry::RegistryKey::subKey(const std::wstring& subkey){
HKEY registryKey;
auto result = RegCreateKeyEx(m_RegistryKey, subkey.c_str(), 0, //m_RegistryKey is 100% valid , for example HKEY_LOCAL_MACHINE
NULL, REG_OPTION_NON_VOLATILE ,KEY_ALL_ACCESS | ((Registry::currentBitMode() == 64) ? KEY_WOW64_64KEY : KEY_WOW64_32KEY),
NULL, ®istryKey, NULL); //currentBitMode return 64 or 32 , depends on what the developer set beforehand
return Registry::SubKey(registryKey, false);
}
它完美无缺 . 我可以在注册表的32个子集或64下创建新的子项 .
现在,这是我的删除方法:
bool Registry::RegistryKey::deleteSubKey(const std::wstring& subkey){
std::wstring name(MAX_PATH, 0);
HKEY subKeyHandle;
auto buffer = subkey;
//m_RegistryKey - member variable, should be valid. at least it's valid when I try it
auto isFunctionSuccessful = RegOpenKeyEx(m_RegistryKey, buffer.c_str(), 0, KEY_ALL_ACCESS | (Registry::currentBitMode() == 64) ? KEY_WOW64_64KEY : KEY_WOW64_32KEY, &subKeyHandle);
if (isFunctionSuccessful != ERROR_SUCCESS){
std::cout << "error : " << isFunctionSuccessful << "\n";
return false;
}
if (buffer.back() != L'\\'){
buffer += L'\\';
}
DWORD dwSize = MAX_PATH;
isFunctionSuccessful = RegEnumKeyEx(subKeyHandle, 0, &name[0], &dwSize, NULL, NULL, NULL, nullptr);
if (isFunctionSuccessful == ERROR_SUCCESS){
do {
name = name.substr(0, name.find(wchar_t(0)));
if (!deleteSubKey(buffer + name)) {
break;
}
dwSize = MAX_PATH;
name.resize(MAX_PATH);
isFunctionSuccessful = RegEnumKeyEx(subKeyHandle, 0, &name[0], &dwSize, NULL, NULL, NULL, nullptr);
} while (isFunctionSuccessful == ERROR_SUCCESS);
}
RegCloseKey(subKeyHandle);
isFunctionSuccessful = RegDeleteKeyEx(m_RegistryKey, subkey.c_str(), (Registry::currentBitMode() == 64) ? KEY_WOW64_64KEY : KEY_WOW64_32KEY, 0);
if (isFunctionSuccessful == ERROR_SUCCESS){
return true;
}
return false;
}
这是我在这个(令人讨厌的)MSDN示例中的C变体:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724235%28v=vs.85%29.aspx
现在,问题出在这里:例如,我在XXX的名下在HKEY_LOCAL_MACHINE / Software下创建一个新的32键,我可以用我的函数打开它,查看它的值并在regedit下查看它 .
如果我尝试删除字符串“Software \ XXX”,我会收到错误代码2 - 找到文件注释 . 如果我尝试删除它inr stirng SOFTWARE \ Wow6432Node \ XXX我得到错误代码5 - 访问被拒绝 . 即使以admin身份运行可执行文件,我仍然会看到2错误代码 . 有任何想法吗?