Как мне использовать реестр?

Проще говоря (я случайный программист, которому не хватает современных подробных знаний в области программирования), кто-то может объяснить самый простой способ использования реестра в codegear C++ (2007).

У меня есть строка кода в старой (старой!) Программе, которую я написал, что вызывает значительную задержку при запуске...

DLB-> Directory = pIniFile-> ReadString ("Параметры","Последний каталог","без ключа!");

Код использует INI-файл. Я хотел бы иметь возможность использовать реестр вместо (для записи переменных, таких как последний каталог, который использовалось приложением)

Но конкретика не важна. Я просто хотел бы получить общие инструкции по использованию реестра, специфичного для компоновщика codegear C++.

Я гуглил это, но, как обычно, с такими вещами я получаю много страниц о сборщике C++ и несколько страниц о реестре Windows, но нет страниц, которые объясняют, как использовать одно с другим.

4 ответа

Решение

Используйте класс TRegistry... (включая registry.hpp)

//Untested, but something like...
TRegistry *reg = new TRegistry;
reg->RootKey = HKEY_CURRENT_USER; // Or whatever root you want to use
reg->OpenKey("theKey",true);
reg->ReadString("theParam",defaultValue);
reg->CloseKey();

Обратите внимание, что открытие и чтение INI-файла, как правило, довольно быстро, поэтому, возможно, вам нужно проверить ваше предположение, что чтение INI-файла на самом деле ваша проблема, я не думаю, что просто взятие вашего имени каталога из реестра вместо этого будет исправить вашу проблему

Включите файл Registry.hpp:

#include <Registry.hpp>

Затем в любой имеющейся функции вы можете написать следующее, чтобы прочитать значение:

String __fastcall ReadRegistryString(const String &key, const String &name, 
    const String &def)
{
    TRegistry *reg = new TRegistry();
    String result;

    try {
        reg->RootKey = HKEY_CURRENT_USER;

        if (reg->OpenKeyReadOnly(key)) {
            result = reg->ReadString(name, def);
            reg->CloseKey();
        }
    }
    __finally {
        delete reg;
    }

    return result;
}

Таким образом, чтение значения должно быть простым:

ShowMessage(ReadRegistryString("Options", "Last Directory", "none"));

Вы можете использовать следующее для записи значения:

void __fastcall WriteRegistryString(const String &key, const String &name, 
    const String &value)
{
    TRegistry *reg = new TRegistry();

    try {
        reg->RootKey = HKEY_CURRENT_USER;

        if (reg->OpenKey(key, true)) {
            reg->WriteString(name, value);
            reg->CloseKey();
        }
    }
    __finally {
        delete reg;
    }
}

Должно быть самоочевидным, помнить попытку... наконец-то действительно полезно при использовании класса VCL TRegistry.

редактировать

Я слышал, что файлы.ini хранятся в реестре в Windows, поэтому, если вы хотите получить преимущество в скорости ini-файлов, вы должны называть их как-то иначе, например.cfg

Это то, что я слышал из хотя и надежного источника, я сам не проверял.

Тим прав, но еще более простой в использовании класс - TIniRegFile, но он также более ограничен в том, что вы можете сделать.

Пожалуйста, смотрите документацию по классу QSettings из библиотеки Qt 4.5. Это позволит вам легко и кроссплатформенно загружать и сохранять параметры конфигурации вашей программы. Реализация Windows использует реестр Windows для загрузки и хранения данных конфигурации вашей программы. На других платформах будет использоваться предпочитаемый платформой механизм хранения данных конфигурации. Это намного лучше, чем непосредственное взаимодействие с реестром Windows, поскольку вы не будете привязаны к конкретной платформе.

Другие вопросы по тегам