Страницы

Поиск по вопросам

пятница, 28 февраля 2020 г.

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

#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. Для любого другого ключа время чтения будет составлять микросекунды, так что любые многопоточные оптимизации тут будут неуместными.

Комментариев нет:

Отправить комментарий