Тема: INI Editor
Начал делать редактор 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