Feature: DLL executing parameters persistence and DLL auto-run
This commit is contained in:
@@ -359,6 +359,88 @@ public:
|
||||
}
|
||||
m_keyCache.clear();
|
||||
}
|
||||
|
||||
// 枚举 m_SubKeyPath 下的所有子键名称
|
||||
// suffix: 只返回以该后缀结尾的键名,默认为空表示返回所有键
|
||||
std::vector<std::string> EnumSubKeys(const std::string& suffix = "") const
|
||||
{
|
||||
std::vector<std::string> result;
|
||||
|
||||
// 使用缓存获取 m_SubKeyPath 的句柄
|
||||
auto it = m_keyCache.find(m_SubKeyPath);
|
||||
HKEY hKey = NULL;
|
||||
if (it != m_keyCache.end()) {
|
||||
hKey = it->second;
|
||||
} else {
|
||||
if (RegOpenKeyExA(m_hRootKey, m_SubKeyPath.c_str(), 0, KEY_READ, &hKey) != ERROR_SUCCESS) {
|
||||
return result;
|
||||
}
|
||||
m_keyCache[m_SubKeyPath] = hKey;
|
||||
}
|
||||
|
||||
char keyName[256];
|
||||
DWORD keyNameSize;
|
||||
DWORD index = 0;
|
||||
|
||||
while (true) {
|
||||
keyNameSize = sizeof(keyName);
|
||||
LONG ret = RegEnumKeyExA(hKey, index, keyName, &keyNameSize, NULL, NULL, NULL, NULL);
|
||||
if (ret == ERROR_NO_MORE_ITEMS) {
|
||||
break;
|
||||
}
|
||||
if (ret == ERROR_SUCCESS) {
|
||||
if (suffix.empty()) {
|
||||
result.push_back(keyName);
|
||||
} else {
|
||||
std::string name(keyName);
|
||||
if (name.size() >= suffix.size() &&
|
||||
name.compare(name.size() - suffix.size(), suffix.size(), suffix) == 0) {
|
||||
result.push_back(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// 枚举指定 MainKey 下的所有值名称
|
||||
// suffix: 只返回以该后缀结尾的值名,默认为空表示返回所有值
|
||||
std::vector<std::string> EnumValues(const std::string& MainKey, const std::string& suffix = "") const
|
||||
{
|
||||
std::vector<std::string> result;
|
||||
|
||||
HKEY hKey = GetCachedKey(MainKey);
|
||||
if (!hKey)
|
||||
return result;
|
||||
|
||||
char valueName[256];
|
||||
DWORD valueNameSize;
|
||||
DWORD index = 0;
|
||||
|
||||
while (true) {
|
||||
valueNameSize = sizeof(valueName);
|
||||
LONG ret = RegEnumValueA(hKey, index, valueName, &valueNameSize, NULL, NULL, NULL, NULL);
|
||||
if (ret == ERROR_NO_MORE_ITEMS) {
|
||||
break;
|
||||
}
|
||||
if (ret == ERROR_SUCCESS) {
|
||||
if (suffix.empty()) {
|
||||
result.push_back(valueName);
|
||||
} else {
|
||||
std::string name(valueName);
|
||||
if (name.size() >= suffix.size() &&
|
||||
name.compare(name.size() - suffix.size(), suffix.size(), suffix) == 0) {
|
||||
result.push_back(name);
|
||||
}
|
||||
}
|
||||
}
|
||||
index++;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
// 配置读取类: 注册表二进制配置(带键句柄缓存)
|
||||
|
||||
Reference in New Issue
Block a user