Исходник re_regedit - простая работа с реестром

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
596
805
What`s up, niggers! Мне понадобился класс для работы с реестром Windows.
Смог найти только древнейший класс от @SR_team: https://www.blast.hk/threads/13855
Код там старый, кривой и не безопасный. Решил написать свой классик, дропаю всем.
Все методы задокументированы, разобраться не составить труда.
Умные разработчики - предлагайте правки кода в теме.

Исходник: https://github.com/Receiver1/re_regedit
Использование:
C++:
// Подробнее на странице GitHub

re.openCatalog(RegEdit::Key::KEY_CURRENT_USER, "Software\\test-app");

re.setString("access_token", "new-access-token");
re.setUlong("expires_in", 123);

std::string accessToken{re.getString("access_token")};
std::cout << accessToken.length() << ": " << accessToken << std::endl;

unsigned long expiresIn{re.getUlong("expires_in")};
std::cout << expiresIn << std::endl;

re.closeCatalog();

// Подробнее на странице GitHub
 
Последнее редактирование:

kin4stat

mq-team
Всефорумный модератор
2,731
4,692
Говно одним словом.

Как минимум:
Вместо нормальных эксепшенов юзается самописное говно(спасибо хоть за то, что наследовано от std::exception).

А еще это самописное говно полная хуета. Привет от виртуального деструктора.

В чем проблема была заюзать std::system_error?

Поехали дальше:

Вместо std::string_view принимается const std::string&

Ну и вишенка на торте - уебанский интерфейс. Есть много вариантов сделать нормально, например как у мапы, или как у жсона, но был выбран самый уебский и систайловый.

В чем проблема сделать


C++:
RegEdit r;

if (auto it = r.find(); it != r.end()) {
    std::visit(*it, [](const auto& value) {
        using T = std::remove_cv_ref_t<decltype(value)>;
        if constexpr(std::is_same_v<T, std::string>) {
            // ...
        }
        else if constexpr(std::is_same_v<T, unsigned long>) {
            // ...
        }
        else {
            // ...
        }
    });
}

Или

C++:
RegEdit r;

try {
   auto value = r.get<std::string>("key");
}
catch (const std::runtime_error& ec) {
    // wrong type ...
    // ... or key not found
}

Или
C++:
RegEdit r;

if (auto it = r.find(); it != r.end()) {
    auto value = it.get<std::string>();
}
Короче одним словом:
говно-переделывай.gif
 
D

deleted-user-204957

Гость
Смог найти только древнейший класс от @SR_team
Нашел за 5 секунд по первой ссылке в гугле
 

kin4stat

mq-team
Всефорумный модератор
2,731
4,692
Нашел за 5 секунд по первой ссылке в гугле
и оба говно
 
  • Ха-ха
  • Нравится
Реакции: MAHEKEH и yung milonov

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
596
805
Говно одним словом.

Как минимум:
Вместо нормальных эксепшенов юзается самописное говно(спасибо хоть за то, что наследовано от std::exception).

А еще это самописное говно полная хуета. Привет от виртуального деструктора.

В чем проблема была заюзать std::system_error?

Поехали дальше:

Вместо std::string_view принимается const std::string&

Ну и вишенка на торте - уебанский интерфейс. Есть много вариантов сделать нормально, например как у мапы, или как у жсона, но был выбран самый уебский и систайловый.

В чем проблема сделать


C++:
RegEdit r;

if (auto it = r.find(); it != r.end()) {
    std::visit(*it, [](const auto& value) {
        using T = std::remove_cv_ref_t<decltype(value)>;
        if constexpr(std::is_same_v<T, std::string>) {
            // ...
        }
        else if constexpr(std::is_same_v<T, unsigned long>) {
            // ...
        }
        else {
            // ...
        }
    });
}

Или

C++:
RegEdit r;

try {
   auto value = r.get<std::string>("key");
}
catch (const std::runtime_error& ec) {
    // wrong type ...
    // ... or key not found
}

Или
C++:
RegEdit r;

if (auto it = r.find(); it != r.end()) {
    auto value = it.get<std::string>();
}
Короче одним словом:
Посмотреть вложение 167047
Хорошая идея на счёт std::system_error. А вот твою хуйню про итераторы я вообще не понял. Зачем получать итератор через find, чтобы потом в итоге всё равно использовать get, лол? Ты предлагаешь сделать перебор ключей через итераторы, но когда ты обращаешься к реестру - заранее знаешь в каком ключе находится твой каталог. И что начнётся если каталог существует в нескольких ключах одновременно. =/
 
Последнее редактирование:
  • Нравится
Реакции: onetinoy

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
596
805

Нововведения и исправления:​

  • Исправил краш при вызове closeCatalog
  • Добавил removeCatalog
  • Добавил поддержку REG_BINARY
  • Заменил кастомный Exception на std::system_error
 
  • Эм
  • Нравится
Реакции: sat0ry и _raz0r

Receiver

🥩 Передай meat, всё в скип, я в темпе
Автор темы
Проверенный
596
805

Нововведения и исправления:​

  • Исправлено непредсказуемое поведение
    • При использовании std::string::resize строка реаллоцируется
 

Dark_Knight

Me, me and me.
Друг
4,056
2,074
Офиеееть... Ну и C++... Тут же пипец как сложно, я вижу для себя много нового, что написал Киня... Я просто в ахуе от этого C++...
Где Киня так кодить научился??? 🧐🤨🙄
Иди исходники буста посмотри или stl

Да ты чё?! Я там охуею, почти ничего не пойму. От этого C++ можно шизоидом стать из-за постоянных ошибок при компиляции!
Когда у меня были ошибки при компиляции и я не понимал, как их пофиксить, мне хотелось создателю C++ лицо об асфальт растереть...
602817a543b5a1.98341276.jpg