Здравствуйте, Conductor, Вы писали:
C>Здравствуйте, ice_vita, Вы писали:
_>>Подскжить функцию которая считываетвсе ключи и значения в HKEY_CURRENT_USER\Software.
C>Смотрите класс CRegKey.
Я имел ввиду функцию которая считывает ВСЕ ключи и ВСЕ значения, то есть считывает все дерево ключа — подключи и значения
Вот у меня была функция, которая рекурсивно заполняла 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 itemfor (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);
}
}
Здравствуйте, MicVit, Вы писали:
MV>Вот у меня была функция, которая рекурсивно заполняла TreeCtrl на основе произвольного ключа из реестра (т.е. можно и HKEY_CURRENT_USER\Software). MV>Тут более простой случай. Но как идея может сгодится. MV>Она только разделы дает, т.е. там надо еще RegQueryValueEx приделать.
MV>
MV>void CMainFrame::ShowWorkspaceItem(HKEY hKey, LPCTSTR lpSubKey, HTREEITEM hParent)
MV>{
MV> CTreeCtrl* pTreeCtrl = (CTreeCtrl*)m_wndWorkspace.GetDlgItem(IDC_TREE1);
MV> HKEY hVarsKey;
MV> LONG nReturn;
MV> DWORD dwDisposition;
MV> nReturn = RegCreateKeyEx(hKey, lpSubKey, 0, NULL, REG_OPTION_NON_VOLATILE,
MV> KEY_READ, NULL, &hVarsKey, &dwDisposition);
MV> ASSERT(nReturn == ERROR_SUCCESS);
MV> DWORD dwIndex; // index of enumerated subkey
MV> CString strName; // name of enumerated subkey
MV> DWORD dwNameSize; // name size of enumerated subkey
MV> DWORD dwSubKeys; // number of subkeys
MV> DWORD dwMaxSubKeyLen; // maximum name size
MV> FILETIME ftLastWriteTime; // last modified time of enumerated subkey(s) (NT only?)
MV> nReturn = RegQueryInfoKey(hVarsKey, NULL, NULL, NULL, &dwSubKeys, &dwMaxSubKeyLen, NULL, NULL, NULL, NULL, NULL, &ftLastWriteTime);
MV> ASSERT(nReturn == ERROR_SUCCESS);
MV> if (hParent != TVI_ROOT)
MV> {
MV> pTreeCtrl->SetItemData(hParent, (DWORD)hVarsKey);
MV> }
MV> else
MV> {
MV> m_hRootKey = hVarsKey;
MV> }
MV> // get the info about each item
MV> for (dwIndex = 0; dwIndex < dwSubKeys; dwIndex++)
MV> {
MV> dwNameSize = dwMaxSubKeyLen + 1;
MV> nReturn = RegEnumKeyEx(hVarsKey, dwIndex, strName.GetBuffer(dwMaxSubKeyLen), &dwNameSize, NULL, NULL, NULL, &ftLastWriteTime);
MV> strName.ReleaseBuffer();
MV> ASSERT(nReturn == ERROR_SUCCESS);
MV> HTREEITEM hItem = pTreeCtrl->InsertItem(strName, hParent);
MV> ShowWorkspaceItem(hVarsKey, strName, hItem);
MV> }
MV>}
MV>
Здравствуйте, MicVit, Вы писали:
MV>Вот у меня была функция, которая рекурсивно заполняла TreeCtrl на основе произвольного ключа из реестра (т.е. можно и HKEY_CURRENT_USER\Software).
Что то это очень мендленный способ. А существует ли нерекурсивный способ прохода дерева?
Re[5]: Реестр
От:
Аноним
Дата:
16.04.05 00:11
Оценка:
Здравствуйте, ice_vita, Вы писали:
_>Что то это очень мендленный способ. А существует ли нерекурсивный способ прохода дерева?
На моей машине эта ветвь весит около 10Mb. Даже экспорт из regedit занимает секунды 2. Меньше не получится, наверное.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, ice_vita, Вы писали:
_>>Что то это очень мендленный способ. А существует ли нерекурсивный способ прохода дерева?
А>На моей машине эта ветвь весит около 10Mb. Даже экспорт из regedit занимает секунды 2. Меньше не получится, наверное.
Да это я ошибся — проверял в дебаг версии — там чего то медленнее получается. Но я еще пробовал этот рекурсивный алгоритм для прохода по директории (довольно большой 1808 папок и 5532 файла) — работает целую минуту (хотя виндовский поиск по *,* в этой директории работал точно столько же). Вот я и спросил есть ли другой способ прохода дерева.
Здравствуйте, ice_vita, Вы писали:
_>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, ice_vita, Вы писали:
_>>>Что то это очень мендленный способ. А существует ли нерекурсивный способ прохода дерева?
А>>На моей машине эта ветвь весит около 10Mb. Даже экспорт из regedit занимает секунды 2. Меньше не получится, наверное.
_>Да это я ошибся — проверял в дебаг версии — там чего то медленнее получается. Но я еще пробовал этот рекурсивный алгоритм для прохода по директории (довольно большой 1808 папок и 5532 файла) — работает целую минуту (хотя виндовский поиск по *,* в этой директории работал точно столько же). Вот я и спросил есть ли другой способ прохода дерева.
Конечно, деререво можно обходить по-разному. Тут она сразу пытается обрабатывать вложения по узлу, как только его встречает.
Весьма вероятно, что в случае базы реестра или папок файловой системы это не есть хороший способ, а, скажем, лучше было бы сначала пройтись по всему разделу, а потом смотреть вложения. Тогда просто надо помнить, куда потом заходить.