Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > RegEnumKey


Автор: sdjhsjhd 7.12.2008, 10:58
Программа, считывает параметр DisplayName из реестра у каждого раздела в папке
HKEY_LOCAL_MACHINE SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\
и добавляет их в список
Код

    HKEY key,subkey;
    wchar_t* value = new wchar_t[255];
    wchar_t* folder = new wchar_t[255];
    const wchar_t* foldername = new wchar_t[255];
    DWORD dwordsize = 255;
    CString string,folders,foldernames;

Код

    RegOpenKey(HKEY_LOCAL_MACHINE,
    L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall",&key);
    int i;
    for (i=0;RegEnumKey(key,i,folder,dwordsize)!=ERROR_NO_MORE_ITEMS;++i)
    {
    if(RegEnumKey(key,i,folder,dwordsize)==ERROR_SUCCESS)
    {
    folders=folder;
    foldernames = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"+folders;
    foldername = foldernames.GetString();
    RegOpenKey(HKEY_LOCAL_MACHINE,foldername,&subkey)
    if(RegQueryValueEx(subkey, L"DisplayName",0,NULL,LPBYTE(value),&dwordsize)==ERROR_SUCCESS)
    {
    string = value;
    List.AddString(string);
    }
    RegCloseKey(subkey);
    }
    }
    RegCloseKey(key);


Впринципе все раюотает, но есть одно НО:
RegEnumKey пропускает некоторые(большую часть)папок, т.е. не возвращает ERROR_SUCCESS.
но это только в цикле! а если сделать без цикла(вручную, подставить числа допустим он не видит второй раздел(1) раздел в SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\, а если вручную написать

Код

RegEnumKey(key,1,folder/*название раздела*/,dwordsize)


то без проблем возвращает название (folder)

Подскажите?

Автор: Rififi 7.12.2008, 13:10
сделай так, чтобы вызов RegEnumKey был только 1 раз на каждой итерации цикла.

Автор: sdjhsjhd 7.12.2008, 13:35
Сделал, и dwordsize переменную заменил на 255(просто число), стало намного лучше, но глюки остались. на этот раз (выесненнго опытным путем)) через брейкпоинт) глюки в 
Код

if(RegQueryValueEx(subkey, L"DisplayName",0,NULL,LPBYTE(value),&dwordsize)==ERROR_SUCCESS)
    {
    string = value;
    List.AddString(string);
    }

тоесть до этого со значениями все нормально, а она уже некоторые(неслколько всего) выдает неправильные.
т.е. в regedit значение DisplayName одно, а RegQueryValueEx выдает другое(значение предидущего каталога).

В чем ошибка?

Автор: Rififi 7.12.2008, 14:07
Цитата(sdjhsjhd @  7.12.2008,  14:35 Найти цитируемый пост)
В чем ошибка? 

не читаешь документацию как вызывать функцию RegQueryValueEx правильно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)