Вот у меня была функция, которая рекурсивно заполняла TreeCtrl на основе произвольного ключа из реестра (т.е. можно и HKEY_CURRENT_USER\Software).
Тут более простой случай. Но как идея может сгодится.
Она только разделы дает, т.е. там надо еще RegQueryValueEx приделать.
void CMainFrame::ShowWorkspaceItem(HKEY hKey, LPCTSTR lpSubKey, HTREEITEM hParent)
{
CTreeCtrl* pTreeCtrl = (CTreeCtrl*)m_wndWorkspace.GetDlgItem(IDC_TREE1);
HKEY hVarsKey;
LONG nReturn;
DWORD dwDisposition;
nReturn = RegCreateKeyEx(hKey, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE,
KEY_READ, NULL, &hVarsKey, &dwDisposition);
ASSERT(nReturn == ERROR_SUCCESS);
DWORD dwIndex; // index of enumerated subkey
CString strName; // name of enumerated subkey
DWORD dwNameSize; // name size of enumerated subkey
DWORD dwSubKeys; // number of subkeys
DWORD dwMaxSubKeyLen; // maximum name size
FILETIME ftLastWriteTime; // last modified time of enumerated subkey(s) (NT only?)
nReturn = RegQueryInfoKey(hVarsKey, NULL, NULL, NULL, &dwSubKeys, &dwMaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, &ftLastWriteTime);
ASSERT(nReturn == ERROR_SUCCESS);
if (hParent != TVI_ROOT)
{
pTreeCtrl->SetItemData(hParent, (DWORD)hVarsKey);
}
else
{
m_hRootKey = hVarsKey;
}
// get the info about each item
for (dwIndex = 0; dwIndex < dwSubKeys; dwIndex++)
{
dwNameSize = dwMaxSubKeyLen + 1;
nReturn = RegEnumKeyEx(hVarsKey, dwIndex, strName.GetBuffer(dwMaxSubKeyLen), &dwNameSize, NULL, NULL, NULL, &ftLastWriteTime);
strName.ReleaseBuffer();
ASSERT(nReturn == ERROR_SUCCESS);
HTREEITEM hItem = pTreeCtrl->InsertItem(strName, hParent);
ShowWorkspaceItem(hVarsKey, strName, hItem);
}
}