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)
那里实际上没有递归.代码只是在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文档.