Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Пн дек 18, 2017 8:06 am

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 22 сообщения ]  На страницу 1 2 След.
Автор Сообщение
 Заголовок сообщения: OpenDialog
СообщениеДобавлено: Пт мар 17, 2017 5:35 pm 
Не в сети

Зарегистрирован: Вт янв 03, 2017 2:49 pm
Сообщения: 4
Не подскажите как из своей программы запустить OpenDialog. И получить путь к выбранному файлу.


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Пт мар 17, 2017 6:21 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн ноя 19, 2012 5:22 pm
Сообщения: 443
Пример в tinypad смотри. Или в icon(инициализация в @icon.asm строка 168 , вызов самого диалога в dlgadd.inc строки 379-386). Там сначала заполняешь структуру для OpenDialog - OpenDialog_data в примерах назван(там почти интуитивно понятно по примерам), затем вызываешь OpenDialog_Init c параметром OpenDialog_data. Это инициализация. Да, перед этим загрузить proc_lib.obj надо. Там эти функции. Затем уже когда надо вызываешь OpenDialog_Start(OpenDialog_data). После закрытия диалога по указателю в OpenDialog_data.opendialog_path лежит выбранный путь.
PS: Добро пожаловать на форум)

_________________
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Пт мар 17, 2017 6:38 pm 
Не в сети

Зарегистрирован: Вт янв 03, 2017 2:49 pm
Сообщения: 4
Спасибо. Сейчас посмотрю :D !


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Вт окт 03, 2017 6:05 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4227
Я потратил сегодня порядка 3-4 часов пытаясь разобраться почему падает OpenDialog. Опишу ситуацию.

OpenDialog вызывается из С-- программ штатным способом и проблем с ним не было до теперешнего момента.
Сейчас он падает при увеличении размера программы.

Во вложении два файла, падучий и нет. Разница в коде вот http://prntscr.com/gss2u1
(вообще будет падать даже если убрать ="", но добавить #include "../lib/collection.h")

Я уже ненавижу это OpenDialog.

Очень нужна помощь понять в чем причина.


Вложения:
Calypte_crash [18.68 КБ]
3 скачивания
Calypte_normal [16.68 КБ]
5 скачиваний

_________________
Через тернии к звездам
Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Вт окт 03, 2017 7:43 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1082
Leency, информации недостаточно.
Скорее всего, даже не в OpenDialog дело.
Компилятор в зависимости от объявления\инициализации openfile_path размещает данные в соответствующих секциях(.bss или .text).
Попробуй размер стека увеличить, может его реально было мало.
Возможно, неправильно заполняется структура OpenDialog, посмотри как в других программах, например, в RUN http://websvn.kolibrios.org/filedetails ... 9#line-270


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Вт окт 03, 2017 7:57 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 751
У меня оба примера зависают при попытке что-либо открыть. Запустил в Debug-ере и вот что он выдает:
Вложение:
c_crash.png
c_crash.png [ 22.6 КБ | 299 просмотров ]

зависает при копировании памяти
Код:
rep movsb

видимо лезет не туда куда надо.
Еще хотелось бы узнать из EFLAGS какое состояние флага df, может оно копирует не в ту сторону что надо.


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Вт окт 03, 2017 8:56 pm 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1082
Сравни http://websvn.kolibrios.org/filedetails ... e.c#line-4 с edi на скриншоте viewtopic.php?p=69500#p69500


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Ср окт 04, 2017 12:22 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4227
Сорри, я ничего не понял. Объясни.

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Ср окт 04, 2017 1:43 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 751
Команды rep movsb используются для копирования кусков памяти, в
ecx - число операций копирования
edi - адрес приемника (куда копируется)
esi - адрес источника (откуда берется)
df - флаг направления копирования
На картинке edi = 1c000 (16) = 114688 (10), тогда как в программе памяти 1024*100 = 102400 (10) байт.
Желательно было-бы вычислить что там за функции такие, они вроди как бы ассемблерные а не С--. Может в саму функцию заходит не корректное значение.


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Ср окт 04, 2017 2:31 pm 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4227
Даже если поставить MEMSIZE 1024*700 программа все равно падает.

Замечу, что у меня alloc_mem == x86esp_reg

Код:
char   os_name[8]   = {'M','E','N','U','E','T','0','1'};
dword  os_version   = 0x00000001;
dword  start_addr   = #______INIT______;
dword  final_addr   = #______STOP______+32;
dword  alloc_mem    = MEMSIZE;
dword  x86esp_reg   = MEMSIZE;
dword  I_Param      = #param;
dword  I_Path       = #program_path;
char param[4096];
char program_path[4096];
В то время как я видел в других программах, что данные для работы opendial размещают после I_END. Например, RTFREAD http://prntscr.com/gt4m77

Может быть в этом проблема?


Вложения:
Calypte_1024x700 [15.15 КБ]
2 скачивания

_________________
Через тернии к звездам
Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Ср окт 04, 2017 2:49 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 751
кажись есть хорошие новости, нашел в файле opendial.mac строки 346-368 то что выдает Debug-ер:
Код:
   rep   movsb
   mov   edi,od_com_area
   mov   [edi+4096],dword 1
   ret
;----------------------------------------------
.copy:
   xor   eax,eax
   cld
@@:
   lodsb
   stosb
   test   eax,eax
   jnz   @b
   ret
;----------------------------------------------
.copy_dir_path:
   xor   eax,eax
   cmp   [esi],al
   jne   @f
   mov   [edi],al
   mov   [ebx],al
   xor   ebx,ebx
   inc   ebx

Кажись понял причину, зависает на функции get_filter_data, при попытке загрузить фильтр в OpenDialog. В фильтре должна быть длинна фильтра (4 байта) а потом текст фильтра. В С-- файле идет фильтр:
Код:
od_filter filter2 = { "TXT",0};

а длинны фильтра нет и следовательно "TXT",0 распознается как длинна фильтра.


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Чт окт 05, 2017 1:02 am 
Не в сети
Designer
Аватара пользователя

Зарегистрирован: Чт янв 25, 2007 3:33 pm
Сообщения: 4227
IgorA
Спасибо, что разобрался! Это правда было очень важно для меня, т.к. я потратил кучу сил на эту проблему и было прям чувство, что перегорел. Теперь понятно, это была моя ошибка. Можно продолжить разработку :)

_________________
Через тернии к звездам


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Чт окт 05, 2017 6:08 am 
Не в сети

Зарегистрирован: Вс окт 30, 2011 6:43 pm
Сообщения: 1082
Ну а я что говорил?
0CodErr писал(а):
неправильно заполняется структура OpenDialog, посмотри как в других программах
Leency писал(а):
я потратил кучу сил
А ведь можно было просто посмотреть рабочий вариант в других программах.
Leency писал(а):
Даже если поставить MEMSIZE 1024*700 программа все равно падает.
Если бы ты запустил Debugger(а ты вряд ли это делал), то скорее всего обнаружил бы, посмотрев на edi, что и этого мало.


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Чт окт 05, 2017 7:52 am 
Не в сети

Зарегистрирован: Вт мар 08, 2016 11:00 pm
Сообщения: 269
Проблема глубже - в отсутствии валидации параметров в библиотеке.


Вернуться к началу
 Заголовок сообщения: Re: OpenDialog
СообщениеДобавлено: Чт окт 05, 2017 9:30 am 
Не в сети
Аватара пользователя

Зарегистрирован: Пн окт 27, 2008 10:10 pm
Сообщения: 751
Siemargl писал(а):
Проблема глубже - в отсутствии валидации параметров в библиотеке.

Я в ревизии 7048 добавил проверку на максимальную длину строки с фильтром. Если фильтр больше чем 4кб то программа и OpenDialog теперь падать не должны. OpenDialog такой фильтр проигнорирует и запустится без фильтра. Вот только думаю что еще надо сделать какое-то предупреждение о том, что фильтр был забракован, это может быть или текст на доске отладки или окно notify.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 22 сообщения ]  На страницу 1 2 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 0 гостей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB