powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не могу понять как прога берет свои настройки. Берет из HKCU, а хочу чтоб из ini-файла
4 сообщений из 4, страница 1 из 1
Не могу понять как прога берет свои настройки. Берет из HKCU, а хочу чтоб из ini-файла
    #38602499
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю как начать. Но попробую.
Консольное приложение. Начало грубо такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class Proga : public PProcess
{
  PCLASSINFO(Proga, PProcess)

  public:
    Proga();

    void Main();

  protected:
    PBoolean Initialise();
};

PCREATE_PROCESS(Proga);
///////////////////////////////////////////////////////////////
Proga::Proga()
  : PProcess("Manufacturer", "Proga",
             MAJOR_VERSION, MINOR_VERSION, BUILD_TYPE, BUILD_NUMBER)
{
}

void Proga::Main()
{



Дык вот, прога (предполагается запуск под "CURRENT_USER") каким-то "волшебным" образом тащит свои настройки при запуске из следующей ветки реестра:

Код: plaintext
1.
HKEY_CURRENT_USER\Software\Manufacturer\Proga\CurrentVersion\Options



Почему "волшебным", потому что я имея километры кода (есть еще библиотека куда ведут PCLASSINFO, PProcess, PCREATE_PROCESS) не могу проследить как оно это делает.

И она сволочь их сразу видит, т.е. в реестре если например, в упомянутой ветке
HKEY_CURRENT_USER\Software\Manufacturer\Proga\CurrentVersion\Options
есть
1) строковый параметр "TestString" со значением "This is My String!!!"
2) параметр DWORD "TestBoolean" со значением 1
3) а например параметр "TestNoBool" вообще отсутствует

То код следующего вида уже в самом начале main():
Код: plaintext
1.
2.
3.
4.
5.
6.
void Proga::Main()
{
  PConfigArgs myargs(GetArguments());
  cout << "TestString=" << myargs.GetOptionString("TestString")<< '\n';
  cout << "TestBoolean=" << myargs.HasOption("TestBoolean")<< '\n';
  cout << "TestNoBool=" << myargs.HasOption("TestNoBool")<< '\n';


выведет на экран следующее:
Код: plaintext
1.
2.
3.
TestString=This is My String!!!"
TestBoolean=1
TestNoBool=0



Все бы ничего и жил бы дальше не копая как оно это делает.

Но я хочу хранить настройки
1) не в реестре, а в INI-файле,
2) не в текущем юзере, а в общем месте

Т.е. очевидное правильное место для этого суть:
Код: plaintext
1.
2.
3.
4.
{CommonAppDataFolder}\Proga\settings.ini
//{CommonAppDataFolder}
// = C:\Documents and Settings\All Users\Application Data (для XP)
// = C:\ProgramData  (для >=Vista)



По идее я знаком с ф-циями GetPrivateProfileString, GetPrivateProfileInt и умею вычислять {CommonAppDataFolder}
т.е. в принципе я смогу наверно "забить ногами" в каком-то месте кода стандартный PConfigArgs myargs,
и впаять туда параметры полученные моим методом.

Но:
у меня есть подозрения что механизм и так стандартный,
т.е. вижу например такой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
 PStringArray PConfig::GetKeys(const PString & section) const
{
  PStringList keys;

  switch (source) {
    case Environment : {
      char ** ptr = _environ;
      while (*ptr != NULL) {
        PString buf = *ptr++;
        keys.AppendString(buf.Left(buf.Find('=')));
      }
      break;
    }

    case Application : {
      PAssert(!section.IsEmpty(), PInvalidParameter);
      RegistryKey registry(location + section, RegistryKey::ReadOnly);
      PString name;
      for (PINDEX idx = 0; registry.EnumValue(idx, name); idx++)
        keys.AppendString(name);
      break;
    }

    case NumSources :
      PAssert(!section.IsEmpty(), PInvalidParameter);
      PString buffer = PGetPrivateProfileString(section, NULL, "", location);
      char * ptr = buffer.GetPointer();
      while (*ptr != '\0') {
        keys.AppendString(ptr);
        ptr += strlen(ptr)+1;
      }
  }


Т.е. не факт, что мне надо изобретать свой паравоз.
Но вот не могу понять, как имеющийся паравоз заставить грузиться из ini.
Есть подозрение, что он автоматом уже будет читать из какого-то ини, вопрос только из какого. И скорее всего не из "{CommonAppDataFolder}".
Как все это копать?
...
Рейтинг: 0 / 0
Не могу понять как прога берет свои настройки. Берет из HKCU, а хочу чтоб из ini-файла
    #38602526
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Иди в самое начало Main()
Там видна инициализация PConfigArgs myargs(GetArguments());
Читай конструктор класса PConfigArgs и исходник функции GetArguments(). Где-то внутри них и есть вызовы для GetPrivateProfileInt/GetPrivateProfileString.
Найдешь хоть один вызов - смотри на последний параметр. Это будет либо переменная, либо дефайн. Потом ищешь где эта переменная (дефайн) задаются и правишь как тебе нужно.
Все просто и легко.
...
Рейтинг: 0 / 0
Не могу понять как прога берет свои настройки. Берет из HKCU, а хочу чтоб из ini-файла
    #38602718
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

спасибо за ответ, буду пытаться понять.
Задал такой же вопрос автору этого дела.
Автор очень удивился
авторI have not used PConfigArgs in may years. Interesting it still works.
и даже накатал какой-то фикс:
Changes to PConfigArgs so a derived class can alter the type of PConfig being used, e.g. file instead of registry.
А мне в письме написал:
авторSo, you can alter the PConfig being used, I have changed it from a simple member to a pointer. You can now create a derived class which can change the m_config member to be any of the other PConfig variants, e.g. to a file at a location of your choice .
Подчеркнутая (мной) фраза особенно радует. Но чет пока ничего не соображаю.
Позже взгляну.
...
Рейтинг: 0 / 0
Не могу понять как прога берет свои настройки. Берет из HKCU, а хочу чтоб из ini-файла
    #38606256
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле, то что я хочу по замыслу делается в одно единственное действие:

Код: plaintext
1.
2.
3.
4.
5.
void Proga::Main()
{
  this->SetConfigurationPath("C:\\settings.ini");
  cout << "GetConfigurationFile=" << this->GetConfigurationFile() << '\n';
  PConfigArgs args(GetArguments());



Но в коде SetConfigurationPath была мерзкая ошибка - двоеточие воспринималось как разделитель путей, для Win это неверно.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 void PProcess::SetConfigurationPath(const PString & path)
 {
   //configurationPaths = path.Tokenise(";:", false); //<<было
   //PTRACE(3, "PTlib", "Configuration path set to " << setfill(';') << configurationPaths);
   configurationPaths = path.Tokenise(PPATH_SEPARATOR, false);
   PTRACE(3, "PTlib", "Configuration path set to " << setfill(PPATH_SEPARATOR) << configurationPaths);
 }

 #ifdef _WIN32
  #define PPATH_SEPARATOR ';'  // As used in PATH environment variable
 #else
  #define PPATH_SEPARATOR ':'  // As used in PATH environment variable
 #endif


Fixed using correct character (':' or ';') depending on platform for PATH style lists of directories.

Ну и до кучи код функции GetConfigurationFile() в ptlib написан очень самодурно.
Там получается что имя INI-файла должно совпадать с именем приложения.
Т.е. если proga.exe, то proga.ini, а если я пытаюсь задать
settings.ini либо config.ini,
то GetConfigurationFile() возвращает пустую строку и местом поиска параметров становится дефолтный путь в реестре.
Пришлось исправлять под себя.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не могу понять как прога берет свои настройки. Берет из HKCU, а хочу чтоб из ini-файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]