Page 1 of 3

OpenDialog

Posted: Fri Mar 17, 2017 5:35 pm
by 8086
Не подскажите как из своей программы запустить OpenDialog. И получить путь к выбранному файлу.

Re: OpenDialog

Posted: Fri Mar 17, 2017 6:21 pm
by GerdtR
Пример в 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

Posted: Fri Mar 17, 2017 6:38 pm
by 8086
Спасибо. Сейчас посмотрю :D !

Re: OpenDialog

Posted: Tue Oct 03, 2017 6:05 pm
by Leency
Я потратил сегодня порядка 3-4 часов пытаясь разобраться почему падает OpenDialog. Опишу ситуацию.

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

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

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

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

Re: OpenDialog

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

Re: OpenDialog

Posted: Tue Oct 03, 2017 7:57 pm
by IgorA
У меня оба примера зависают при попытке что-либо открыть. Запустил в Debug-ере и вот что он выдает:
c_crash.png
c_crash.png (22.6 KiB)
Viewed 13964 times
зависает при копировании памяти

Code: Select all

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

Re: OpenDialog

Posted: Tue Oct 03, 2017 8:56 pm
by 0CodErr

Re: OpenDialog

Posted: Wed Oct 04, 2017 12:22 pm
by Leency
Сорри, я ничего не понял. Объясни.

Re: OpenDialog

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

Re: OpenDialog

Posted: Wed Oct 04, 2017 2:31 pm
by Leency
Даже если поставить MEMSIZE 1024*700 программа все равно падает.

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

Code: Select all

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

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

Re: OpenDialog

Posted: Wed Oct 04, 2017 2:49 pm
by IgorA
кажись есть хорошие новости, нашел в файле opendial.mac строки 346-368 то что выдает Debug-ер:

Code: Select all

	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: Select all

od_filter filter2 = { "TXT",0};
а длинны фильтра нет и следовательно "TXT",0 распознается как длинна фильтра.

Re: OpenDialog

Posted: Thu Oct 05, 2017 1:02 am
by Leency
IgorA
Спасибо, что разобрался! Это правда было очень важно для меня, т.к. я потратил кучу сил на эту проблему и было прям чувство, что перегорел. Теперь понятно, это была моя ошибка. Можно продолжить разработку :)

Re: OpenDialog

Posted: Thu Oct 05, 2017 6:08 am
by 0CodErr
Ну а я что говорил?
0CodErr wrote:неправильно заполняется структура OpenDialog, посмотри как в других программах
Leency wrote: я потратил кучу сил
А ведь можно было просто посмотреть рабочий вариант в других программах.
Leency wrote:Даже если поставить MEMSIZE 1024*700 программа все равно падает.
Если бы ты запустил Debugger(а ты вряд ли это делал), то скорее всего обнаружил бы, посмотрев на edi, что и этого мало.

Re: OpenDialog

Posted: Thu Oct 05, 2017 7:52 am
by Siemargl
Проблема глубже - в отсутствии валидации параметров в библиотеке.

Re: OpenDialog

Posted: Thu Oct 05, 2017 9:30 am
by IgorA
Siemargl wrote:Проблема глубже - в отсутствии валидации параметров в библиотеке.
Я в ревизии 7048 добавил проверку на максимальную длину строки с фильтром. Если фильтр больше чем 4кб то программа и OpenDialog теперь падать не должны. OpenDialog такой фильтр проигнорирует и запустится без фильтра. Вот только думаю что еще надо сделать какое-то предупреждение о том, что фильтр был забракован, это может быть или текст на доске отладки или окно notify.