1

Тема: INI Editor

misc.php?action=pun_attachment&item=126&download=0
Начал делать редактор ini-файлов — столкнулся с какой-то проблемой при совместном использовании библиотек.
Непонятно пока, где именно ошибка.
Ситуация примерно такая:

  • Загрузили LibIni, инициализировали её вызовом 'lib_init';

  • Загрузили LibImg, инициализировали её вызовом 'lib_init';

  • Вылетает при использовании LibIni — "General protection fault".

Если не вызывать(только для теста) 'lib_init' для LibImg, то при использовании LibIni не вылетает.
LibImg и LibIni обе используют библиотеку LibIO и грузят её при инициализации.
Не может ли из-за этого быть проблемы?
В итоге на данный момент использую картинки, вшитые в саму программу, а не гружу их с помощью LibImg.

Влияет порядок инициализации библиотек.

  // вылетает, если инициализация LibImg происходит раньше, чем LibIni  
  //InitLibrary(LibImgLibInit);  тут вылетает, поэтому +
  InitLibrary(LibIniLibInit);   //                     |
  InitLibrary(BoxLibLibInit);   //                     |
  InitLibrary(LibImgLibInit);   // перемещаем сюда  <--+ 

Получается, что LibIO, которую грузят и LibImg, и LibIni инизиализируется дважды в одном и том же процессе.
По идее, если процессы разные, то из-за Copy-On-Write должна быть создана новая копия изменённой страницы.
Но в нашем случае мы вызываем из одного и того же процесса.
Наверное, только ядерщики могут сказать точнее.

Я использую компонент TreeList из BoxLib, но при работе с ним возникают некоторые неточности. 
Например, вот такая неточность:
Хочу проверить в TreeList уровень текущего выделенного элемента.
Почему-то приходится указывать позицию на 1 больше

if tl_node_poi_get_info(TreeList, TreeList.cur_pos + 1).lev = 1 then

мне казалось, что надо так

if tl_node_poi_get_info(TreeList, TreeList.cur_pos).lev = 1 then

или это такая фича и всё правильно?

Не нашёл способа, как узнать родительский узел — пришлось написать самодельную функцию для этого 

Может я неправильно что-то делаю, но если свернуть какие-нибудь узлы, то неверно работает tl_node_poi_get_info — возвращает значения не того элемента.
Правильно работает только, когда все узлы развёрнуты.
Было бы ещё полезно иметь функции ExpandAll и CollapseAll — свернуть и развернуть все узлы.

Ещё заметил проблему с функцией edit_box_set_text:
если перед вызовом в EditBox был очень длинный текст(длиннее размера EditBox), то после вызова он частично остаётся + артефакты

  ini_get_str(FilePath, SectionName, KeyName, Buffer, BUFFER_LENGTH, '' );  
  edit_box_set_text(Edit1, Buffer);

Думаю, разработчики BoxLib лучше разберутся.

Прикладываю исходный код в архиве INIEditor.7z и само приложение INIEditor.kex

Post's attachments

Иконка вложений INIEditor.7z 9.08 Кб, 67 скачиваний с 2022-01-01 

Иконка вложений INIEditor.kex 3.16 Кб, 69 скачиваний с 2022-01-01 

INIEditor.PNG, 15.76 Кб, 525 x 400
INIEditor.PNG 15.76 Кб, 66 скачиваний с 2022-01-01 

2

Re: INI Editor

У меня была проблема при одновременном использовании библиотек http и libini.

3

Re: INI Editor

Leency пишет:

проблема при одновременном использовании библиотек http и libini.

Библиотека LibIni импортирует LibIO.
А библиотека Http импортирует LibIni, которая  импортирует LibIO.
Да, ситуация точно такая же — LibIO будет инициализирована дважды, возможно, в этом и проблема.

4

Re: INI Editor

FYI http://board.kolibrios.org/viewtopic.php?p=77936#p77936

5

Re: INI Editor

Это замечательно smile
Очень хорошо, что код библиотеки поддерживается и дорабатывается!