#c_sharp #cpp #windows #gui
Закрыт. Данный вопрос необходимо конкретизировать. Ответы на него в данный момент не принимаются. Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он был сосредоточен только на одной проблеме, отредактировав его. Закрыт 2 года назад. Нужно написать аналог утилиты regedit для работы с реестром Windows для курсовой на c++, можно и на c#. Хотелось бы уточнить, насколько вообще это задание сложное? Какие библиотеки можно использовать для этого? С помощью каких компонентов можно создать такой графический интерфейс (дерево каталогов и т.п.)?
Ответы
Ответ 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. Для любого другого ключа время чтения будет составлять микросекунды, так что любые многопоточные оптимизации тут будут неуместными.
Комментариев нет:
Отправить комментарий