Реестр
От: ice_vita  
Дата: 15.04.05 17:54
Оценка:
Подскжить функцию которая считываетвсе ключи и значения в HKEY_CURRENT_USER\Software.
Re: Реестр
От: Conductor СССР  
Дата: 15.04.05 18:00
Оценка:
Здравствуйте, ice_vita, Вы писали:

_>Подскжить функцию которая считываетвсе ключи и значения в HKEY_CURRENT_USER\Software.


Смотрите класс CRegKey.
Re[2]: Реестр
От: ice_vita  
Дата: 15.04.05 18:18
Оценка:
Здравствуйте, Conductor, Вы писали:

C>Здравствуйте, ice_vita, Вы писали:


_>>Подскжить функцию которая считываетвсе ключи и значения в HKEY_CURRENT_USER\Software.


C>Смотрите класс CRegKey.


Я имел ввиду функцию которая считывает ВСЕ ключи и ВСЕ значения, то есть считывает все дерево ключа — подключи и значения
Re[3]: Реестр
От: MicVit  
Дата: 15.04.05 18:53
Оценка: 2 (1)
Вот у меня была функция, которая рекурсивно заполняла 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);

    }
    
}
Re[4]: Реестр
От: ice_vita  
Дата: 15.04.05 21:45
Оценка:
Здравствуйте, 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>


спасибо большое
Re[4]: Реестр
От: ice_vita  
Дата: 15.04.05 23:44
Оценка:
Здравствуйте, MicVit, Вы писали:

MV>Вот у меня была функция, которая рекурсивно заполняла TreeCtrl на основе произвольного ключа из реестра (т.е. можно и HKEY_CURRENT_USER\Software).



Что то это очень мендленный способ. А существует ли нерекурсивный способ прохода дерева?
Re[5]: Реестр
От: Аноним  
Дата: 16.04.05 00:11
Оценка:
Здравствуйте, ice_vita, Вы писали:

_>Что то это очень мендленный способ. А существует ли нерекурсивный способ прохода дерева?


На моей машине эта ветвь весит около 10Mb. Даже экспорт из regedit занимает секунды 2. Меньше не получится, наверное.
Re[6]: Реестр
От: ice_vita  
Дата: 16.04.05 09:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, ice_vita, Вы писали:


_>>Что то это очень мендленный способ. А существует ли нерекурсивный способ прохода дерева?


А>На моей машине эта ветвь весит около 10Mb. Даже экспорт из regedit занимает секунды 2. Меньше не получится, наверное.


Да это я ошибся — проверял в дебаг версии — там чего то медленнее получается. Но я еще пробовал этот рекурсивный алгоритм для прохода по директории (довольно большой 1808 папок и 5532 файла) — работает целую минуту (хотя виндовский поиск по *,* в этой директории работал точно столько же). Вот я и спросил есть ли другой способ прохода дерева.
Re[7]: Реестр
От: MicVit  
Дата: 18.04.05 10:53
Оценка:
Здравствуйте, ice_vita, Вы писали:

_>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, ice_vita, Вы писали:


_>>>Что то это очень мендленный способ. А существует ли нерекурсивный способ прохода дерева?


А>>На моей машине эта ветвь весит около 10Mb. Даже экспорт из regedit занимает секунды 2. Меньше не получится, наверное.


_>Да это я ошибся — проверял в дебаг версии — там чего то медленнее получается. Но я еще пробовал этот рекурсивный алгоритм для прохода по директории (довольно большой 1808 папок и 5532 файла) — работает целую минуту (хотя виндовский поиск по *,* в этой директории работал точно столько же). Вот я и спросил есть ли другой способ прохода дерева.


Конечно, деререво можно обходить по-разному. Тут она сразу пытается обрабатывать вложения по узлу, как только его встречает.
Весьма вероятно, что в случае базы реестра или папок файловой системы это не есть хороший способ, а, скажем, лучше было бы сначала пройтись по всему разделу, а потом смотреть вложения. Тогда просто надо помнить, куда потом заходить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.