如何访问注册表,并在C中循环键(提供示例C#代码)?

lia*_*dee 3 c c# windows registry winapi

我基本上想要执行与此代码相同的功能,但在C中.

RegistryKey regAdapters = Registry.LocalMachine.OpenSubKey ( AdapterKey, true);
    string[] keyNames = regAdapters.GetSubKeyNames();
    char[] devGuid;
    foreach(string x in keyNames)
    {
        RegistryKey regAdapter = regAdapters.OpenSubKey(x);
        object id = regAdapter.GetValue("ComponentId");
        if (id != null && id.ToString() == "tap0801") devGuid = regAdapter.GetValue("NetCfgInstanceId").ToString();
    }
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 5

那里实际上没有递归.代码只是在HKLM下打开一个键,枚举所有子键,并查找特定的命名值.概括地说,您的C代码将由这些Win32 API调用组成:

HKEY hRegAdapters;
LONG res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AdapterKey, 0,
  KEY_READ, &hRegAdapters);
// error checking by testing res omitted
Run Code Online (Sandbox Code Playgroud)

现在您已经打开了密钥,您可以枚举子密钥:

for (DWORD Index=0; ; Index++)
{
    char SubKeyName[255];
    DWORD cName = 255;
    LONG res = RegEnumKeyEx(hRegAdapters, Index, SubKeyName, &cName, 
        NULL, NULL, NULL, NULL);
    if (res != ERROR_SUCCESS)
        break;
    // do something with Name
}
Run Code Online (Sandbox Code Playgroud)

现在您拥有每个子键的名称,您可以使用以下内容读取值RegGetValue:

char Value[64];
DWORD cbData = 64;
LONG res = RegGetValue(hSubKey, SubKeyName, "ComponentId",
    RRF_RT_REG_SZ, NULL, Value, &cbData);
// check for errors now before using Value
Run Code Online (Sandbox Code Playgroud)

RegGetValue是Vista中添加的便利功能.如果你需要你的代码在XP上运行,那么你将不得不打电话RegQueryValueEx.这涉及"ComponentId"首先打开子项.

请注意,我省略了所有错误检查,也忽略了Unicode的问题并调用了ANSI API.我会把所有这些细节留给你.

记得在RegCloseKey(hRegAdapters)完成后打电话.

有关如何访问注册表的所有详细信息,请参阅MSDN文档.