C++ wxWidgets遍历注册表项

C++ wxWidgets遍历注册表项,c++,winapi,registry,wxwidgets,C++,Winapi,Registry,Wxwidgets,我正在制作一个简单的应用程序来通过蓝牙串行COM端口收集和表示数据,我不想硬编码COM端口。因此,我想通过查找HKEY\U LOCAL\U MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM来枚举COM端口。然而,我对wxWidgets和win32注册表术语都是相当陌生的(我仍然不明白wxWidgets文档中的“名称”和“值”应该是什么,它们没有按预期工作)。我想要的是遍历所有通信端口,并将它们添加到下拉列表中。这不起作用: wxRegKey regKey(wxRegKe

我正在制作一个简单的应用程序来通过蓝牙串行COM端口收集和表示数据,我不想硬编码COM端口。因此,我想通过查找
HKEY\U LOCAL\U MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
来枚举COM端口。然而,我对wxWidgets和win32注册表术语都是相当陌生的(我仍然不明白wxWidgets文档中的“名称”和“值”应该是什么,它们没有按预期工作)。我想要的是遍历所有通信端口,并将它们添加到下拉列表中。这不起作用:

wxRegKey regKey(wxRegKey::HKLM,"HARDWARE\\DEVICEMAP\\SERIALCOMM");
size_t subkeys;
long k = 1;
regKey.Open(wxRegKey::Read);
regKey.GetKeyInfo(&subkeys, NULL, NULL, NULL);
wxString key_name;
regKey.GetFirstValue(key_name, k);
m_drop_down->Append(key_name);
for (int i = 0; i < subkeys; i++) {
    regKey.GetNextValue(key_name, k);
    m_drop_down->Append(key_name);
}
regKey.Close();
wxRegKey regKey(wxRegKey::HKLM,“硬件\\设备映射\\串行通信”); 子键的大小; 长k=1; 打开(wxRegKey::Read); GetKeyInfo(&subkeys,NULL,NULL,NULL); wxString key_name; regKey.GetFirstValue(key_name,k); m_下拉菜单->追加(键名称); 对于(int i=0;i<子键;i++){ regKey.GetNextValue(key_name,k); m_下拉菜单->追加(键名称); } regKey.Close(); 它只在下拉列表中添加一个
\Device\BthModem2
。如果有人能澄清这些术语并告诉我应该如何让它发挥作用,我将不胜感激。以下是注册表项在我看来的参考信息,我希望将
COM3
COM4
COM5
COM6
附加到下拉列表中:

如果要获取“值”(右列中的内容),可以声明如下函数:

wxString GetStringData(const wxRegKey& regKey, const wxString& valueName)
{
    wxRegKey::ValueType vtype = regKey.GetValueType(valueName);

    wxString data;

    if ( vtype == wxRegKey::Type_String )
    {
        regKey.QueryValue(valueName, data, true);
    }

    return data;
}
while(regKey.GetNextValue(key_name, k)) {
    wxString data = GetStringData(regKey,valueName);
    if ( !data.IsEmpty() )
    {
         m_drop_down->Append(key_name);
    }
}
要从注册表项中获取完整的列表,可以像下面这样迭代注册表项中的值:

wxString GetStringData(const wxRegKey& regKey, const wxString& valueName)
{
    wxRegKey::ValueType vtype = regKey.GetValueType(valueName);

    wxString data;

    if ( vtype == wxRegKey::Type_String )
    {
        regKey.QueryValue(valueName, data, true);
    }

    return data;
}
while(regKey.GetNextValue(key_name, k)) {
    wxString data = GetStringData(regKey,valueName);
    if ( !data.IsEmpty() )
    {
         m_drop_down->Append(key_name);
    }
}
GetNextValue
在循环中没有更多要提取的值时,将返回false

这并不完全,因为这不会区分类型不是字符串的注册表值和类型是字符串但数据为空的注册表值,但如果有必要进行区分,应该清楚如何修改函数和/或迭代。

根据和,
RegGetValue
检索指定注册表值的类型和数据。
代码:


这不是我想要的。经过进一步检查,我怀疑“注册表项”与子文件夹类似,“注册表值”是我要查找的(因此我必须
regKey.GetKeyInfo(NULL,NULL,&values,NULL);
而不是
regKey.GetKeyInfo(&subkey,NULL,NULL,NULL);
)。为了得到regedit所指的
data
,我必须调用
regKey.QueryValue(val\u name,val\u data)。这个术语对我来说非常混乱,因为winapi和wxWidgets对相同的东西使用不同的术语。我已经更新了答案,以便从regedt图片中获得正确列的内容。(“数据”或“值”或其他任何名称)。