windows编程: 注册表操作

195 阅读2分钟
  • 打开或创建注册表项

    • 使用 RegCreateKeyEx 打开或创建指定的注册表项。
  • 设置注册表值

    • 使用 RegSetValueEx 设置一个字符串值(REG_SZ)。
  • 读取注册表值

    • 使用 RegGetValue 读取之前设置的值,并将其存储到缓冲区。
  • 删除注册表值

    • 使用 RegDeleteValue 删除指定的注册表值。
  • 关闭注册表项

    • 使用 RegCloseKey 关闭打开的注册表项。
  • 枚举注册表子项

    • 使用 RegEnumKeyEx 来遍历指定注册表项的所有子项。

    • 对于每个子项,使用 RegOpenKeyEx 打开它,然后使用 RegEnumValue 遍历该子项的所有值

示例代码:

#include <windows.h>
#include <iostream>

void EnumerateRegistryKey(HKEY hKey) {
    DWORD index = 0;
    WCHAR subKeyName[256];
    DWORD subKeyNameSize = sizeof(subKeyName) / sizeof(subKeyName[0]);

    // 遍历所有子项
    while (RegEnumKeyEx(hKey, index, subKeyName, &subKeyNameSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) {
        std::wcout << L"Subkey: " << subKeyName << std::endl;

        // 打开子项
        HKEY hSubKey;
        if (RegOpenKeyEx(hKey, subKeyName, 0, KEY_READ, &hSubKey) == ERROR_SUCCESS) {
            // 遍历子项的值
            DWORD valueIndex = 0;
            WCHAR valueName[256];
            DWORD valueNameSize = sizeof(valueName) / sizeof(valueName[0]);
            BYTE valueData[256];
            DWORD valueDataSize = sizeof(valueData);

            while (RegEnumValue(hSubKey, valueIndex, valueName, &valueNameSize, NULL, NULL, valueData, &valueDataSize) == ERROR_SUCCESS) {
                std::wcout << L"  Value Name: " << valueName << L", Value Data: " << (WCHAR*)valueData << std::endl;
                valueIndex++;
                valueNameSize = sizeof(valueName) / sizeof(valueName[0]);
                valueDataSize = sizeof(valueData);
            }

            RegCloseKey(hSubKey);
        }

        index++;
        subKeyNameSize = sizeof(subKeyName) / sizeof(subKeyName[0]);
    }
}

int main() {
    HKEY hKey;
    const wchar_t* subKey = L"SOFTWARE\\MyExampleApp";
    const wchar_t* valueName = L"MyValue";
    const wchar_t* valueData = L"Hello, Registry!";

    // 创建或打开注册表项
    if (RegCreateKeyEx(HKEY_CURRENT_USER, subKey, 0, NULL, 0, KEY_WRITE | KEY_READ, NULL, &hKey, NULL) != ERROR_SUCCESS) {
        std::cerr << "Failed to create or open registry key." << std::endl;
        return 1;
    }

    // 设置注册表值
    if (RegSetValueEx(hKey, valueName, 0, REG_SZ, (const BYTE*)valueData, (wcslen(valueData) + 1) * sizeof(wchar_t)) != ERROR_SUCCESS) {
        std::cerr << "Failed to set registry value." << std::endl;
        RegCloseKey(hKey);
        return 1;
    }

    // 读取注册表值
    wchar_t buffer[256];
    DWORD bufferSize = sizeof(buffer);
    if (RegGetValue(hKey, NULL, valueName, RRF_RT_REG_SZ, NULL, buffer, &bufferSize) == ERROR_SUCCESS) {
        std::wcout << L"Value from registry: " << buffer << std::endl;
    } else {
        std::cerr << "Failed to get registry value." << std::endl;
    }

    // 遍历注册表项的所有子项和它们的值
    std::wcout << L"Enumerating registry keys and values..." << std::endl;
    EnumerateRegistryKey(hKey);

    // 删除注册表值
    if (RegDeleteValue(hKey, valueName) != ERROR_SUCCESS) {
        std::cerr << "Failed to delete registry value." << std::endl;
    }

    // 关闭注册表项
    RegCloseKey(hKey);
    return 0;
}