Board.KolibriOS.org

Official KolibriOS board
It is currently Sun Aug 25, 2019 10:11 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 30 posts ]  Go to page 1 2 Next
Author Message
 Post subject: OpenDialog
PostPosted: Fri Mar 17, 2017 5:35 pm 
Offline

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


Top
   
 Post subject: Re: OpenDialog
PostPosted: Fri Mar 17, 2017 6:21 pm 
Offline
User avatar

Joined: Mon Nov 19, 2012 5:22 pm
Posts: 455
Пример в 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: Добро пожаловать на форум)

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


Top
   
 Post subject: Re: OpenDialog
PostPosted: Fri Mar 17, 2017 6:38 pm 
Offline

Joined: Tue Jan 03, 2017 2:49 pm
Posts: 4
Спасибо. Сейчас посмотрю :D !


Top
   
 Post subject: Re: OpenDialog
PostPosted: Tue Oct 03, 2017 6:05 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5054
Я потратил сегодня порядка 3-4 часов пытаясь разобраться почему падает OpenDialog. Опишу ситуацию.

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

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

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

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


Attachments:
Calypte_crash [18.68 KiB]
Downloaded 96 times
Calypte_normal [16.68 KiB]
Downloaded 96 times

_________________
Через тернии к звездам
Top
   
 Post subject: Re: OpenDialog
PostPosted: Tue Oct 03, 2017 7:43 pm 
Offline

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


Top
   
 Post subject: Re: OpenDialog
PostPosted: Tue Oct 03, 2017 7:57 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 811
У меня оба примера зависают при попытке что-либо открыть. Запустил в Debug-ере и вот что он выдает:
Attachment:
c_crash.png
c_crash.png [ 22.6 KiB | Viewed 3612 times ]

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

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


Top
   
 Post subject: Re: OpenDialog
PostPosted: Tue Oct 03, 2017 8:56 pm 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Сравни http://websvn.kolibrios.org/filedetails ... e.c#line-4 с edi на скриншоте viewtopic.php?p=69500#p69500


Top
   
 Post subject: Re: OpenDialog
PostPosted: Wed Oct 04, 2017 12:22 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5054
Сорри, я ничего не понял. Объясни.

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


Top
   
 Post subject: Re: OpenDialog
PostPosted: Wed Oct 04, 2017 1:43 pm 
Offline
User avatar

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


Top
   
 Post subject: Re: OpenDialog
PostPosted: Wed Oct 04, 2017 2:31 pm 
Offline
Designer
User avatar

Joined: Thu Jan 25, 2007 3:33 pm
Posts: 5054
Даже если поставить MEMSIZE 1024*700 программа все равно падает.

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

Code:
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

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


Attachments:
Calypte_1024x700 [15.15 KiB]
Downloaded 92 times

_________________
Через тернии к звездам
Top
   
 Post subject: Re: OpenDialog
PostPosted: Wed Oct 04, 2017 2:49 pm 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 811
кажись есть хорошие новости, нашел в файле opendial.mac строки 346-368 то что выдает Debug-ер:
Code:
   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 байта) а потом текст фильтра. В С-- файле идет фильтр:
Code:
od_filter filter2 = { "TXT",0};

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


Top
   
 Post subject: Re: OpenDialog
PostPosted: Thu Oct 05, 2017 1:02 am 
Offline
Designer
User avatar

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

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


Top
   
 Post subject: Re: OpenDialog
PostPosted: Thu Oct 05, 2017 6:08 am 
Offline

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


Top
   
 Post subject: Re: OpenDialog
PostPosted: Thu Oct 05, 2017 7:52 am 
Offline

Joined: Tue Mar 08, 2016 11:00 pm
Posts: 436
Проблема глубже - в отсутствии валидации параметров в библиотеке.


Top
   
 Post subject: Re: OpenDialog
PostPosted: Thu Oct 05, 2017 9:30 am 
Offline
User avatar

Joined: Mon Oct 27, 2008 10:10 pm
Posts: 811
Siemargl wrote:
Проблема глубже - в отсутствии валидации параметров в библиотеке.

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 30 posts ]  Go to page 1 2 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited