Разработка аналога regedit в Windows [закрыт]

181
22 января 2019, 08:00

Нужно написать аналог утилиты regedit для работы с реестром Windows для курсовой на c++, можно и на c#. Хотелось бы уточнить, насколько вообще это задание сложное? Какие библиотеки можно использовать для этого? С помощью каких компонентов можно создать такой графический интерфейс (дерево каталогов и т.п.)?

Answer 1

Это Windows программа в самой простейшей вариации. В главном окне - вертикальный сплиттер, в левой панели дерево (tree control), в правой панели список (list control). Графическое оформление легко исполняется даже на чистом WinAPI, с любым фреймворком вообще без труда. Пожалуй, проще всего будет Visual C++ и MFC - в шаблонах MFC проектов есть 'Explorer', который создает это приложение полностью, останется только добавить конкретное наполнение (то есть работу с реестром). Для работы с реестром можно использовать класс CRegKey.

ДОПОЛНЕНИЕ

Выше произошел долгий спор на тему того, нужно ли асинхронно читать реестр для последующего отображения в treectrl и listctrl. Я считаю такую оптимизацию полной глупостью, и чтобы не быть голословным, решил написать небольшой тест, который читает основные ветки и сообщает затраченное время. Первоначальная версия с GetTickCount выдала все нули, так что пришлось переделывать ее на таймер высокого разрешения.

static double frequency;
void EnumReg(LPCTSTR szHiveName, HKEY hHive) {
    LARGE_INTEGER tm0;
    if (!::QueryPerformanceCounter(&tm0)) throw win_error();
    TCHAR szName[MAX_PATH];
    DWORD uNameLen;
    DWORD nKeys = 0;
    LONG lr;
    for (;;) {
        uNameLen = MAX_PATH;
        lr = ::RegEnumKeyEx(hHive, nKeys++, szName, &uNameLen, NULL, NULL, NULL, NULL);
        if (lr == ERROR_NO_MORE_ITEMS) break;
        if (lr != ERROR_SUCCESS) throw win_error(lr);
    }
    LARGE_INTEGER elaps;
    if (!::QueryPerformanceCounter(&elaps)) throw win_error();
    elaps.QuadPart -= tm0.QuadPart;
    double elapsed = (double)elaps.QuadPart;
    elapsed *= 1.0e3;       // We need milliseconds
    elapsed /= frequency;
    _tprintf(_TEXT("%s:\t%u subkeys, elapsed time %7.3fms\n"), szHiveName, nKeys, elapsed);
}

void main() {
    try {
        LARGE_INTEGER freq;
        if (!::QueryPerformanceFrequency(&freq)) throw win_error();
        frequency = (double)freq.QuadPart;
        EnumReg(_TEXT("HKEY_LOCAL_MACHINE"), HKEY_LOCAL_MACHINE);
        EnumReg(_TEXT("HKEY_CURRENT_USER"), HKEY_CURRENT_USER);
        EnumReg(_TEXT("HKEY_CLASSES_ROOT"), HKEY_CLASSES_ROOT);
    }
    catch (generic_error &se) {
        printf("\n\n");
        printf(se.Message());
    }
    TCHAR pat[120];
    printf("\nPress any key...");
    _getts(pat);
}

В результате вышло следующее:

Отсюда очевидно, что время наполнения и обновления контрола будет минимум на порядок превышать время чтения реестра. Это если говорить о уникально огромной ветке HKCR. Для любого другого ключа время чтения будет составлять микросекунды, так что любые многопоточные оптимизации тут будут неуместными.

READ ALSO
Требуется сохранить код символа в файле

Требуется сохранить код символа в файле

Есть интовый массив с кодами символовЕго нужно записать в файл

168
Контрольная сумма для заголовка IPv4

Контрольная сумма для заголовка IPv4

Был задан такой вопрос, но я вроде как приблизился к решению вопроса о своей задачеВ интернете найден мной такой метод:

190