OpenDialog

Applications development, KoOS API questions
  • Пример в 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: Добро пожаловать на форум)
    Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
  • Спасибо. Сейчас посмотрю :D !
  • Я потратил сегодня порядка 3-4 часов пытаясь разобраться почему падает OpenDialog. Опишу ситуацию.

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

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

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

    Очень нужна помощь понять в чем причина.
    Attachments
    Calypte_crash (18.68 KiB)
    Downloaded 380 times
    Calypte_normal (16.68 KiB)
    Downloaded 393 times
    Из хаоса в космос
  • Leency, информации недостаточно.
    Скорее всего, даже не в OpenDialog дело.
    Компилятор в зависимости от объявления\инициализации openfile_path размещает данные в соответствующих секциях(.bss или .text).
    Попробуй размер стека увеличить, может его реально было мало.
    Возможно, неправильно заполняется структура OpenDialog, посмотри как в других программах, например, в RUN http://websvn.kolibrios.org/filedetails ... 9#line-270
  • У меня оба примера зависают при попытке что-либо открыть. Запустил в Debug-ере и вот что он выдает:
    c_crash.png
    c_crash.png (22.6 KiB)
    Viewed 13949 times
    зависает при копировании памяти

    Code: Select all

    rep movsb
    видимо лезет не туда куда надо.
    Еще хотелось бы узнать из EFLAGS какое состояние флага df, может оно копирует не в ту сторону что надо.
  • Сорри, я ничего не понял. Объясни.
    Из хаоса в космос
  • Команды rep movsb используются для копирования кусков памяти, в
    ecx - число операций копирования
    edi - адрес приемника (куда копируется)
    esi - адрес источника (откуда берется)
    df - флаг направления копирования
    На картинке edi = 1c000 (16) = 114688 (10), тогда как в программе памяти 1024*100 = 102400 (10) байт.
    Желательно было-бы вычислить что там за функции такие, они вроди как бы ассемблерные а не С--. Может в саму функцию заходит не корректное значение.
  • Даже если поставить 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

    Может быть в этом проблема?
    Attachments
    Calypte_1024x700 (15.15 KiB)
    Downloaded 377 times
    Из хаоса в космос
  • кажись есть хорошие новости, нашел в файле 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 распознается как длинна фильтра.
  • IgorA
    Спасибо, что разобрался! Это правда было очень важно для меня, т.к. я потратил кучу сил на эту проблему и было прям чувство, что перегорел. Теперь понятно, это была моя ошибка. Можно продолжить разработку :)
    Из хаоса в космос
  • Ну а я что говорил?
    0CodErr wrote:неправильно заполняется структура OpenDialog, посмотри как в других программах
    Leency wrote: я потратил кучу сил
    А ведь можно было просто посмотреть рабочий вариант в других программах.
    Leency wrote:Даже если поставить MEMSIZE 1024*700 программа все равно падает.
    Если бы ты запустил Debugger(а ты вряд ли это делал), то скорее всего обнаружил бы, посмотрев на edi, что и этого мало.
  • Проблема глубже - в отсутствии валидации параметров в библиотеке.
  • Siemargl wrote:Проблема глубже - в отсутствии валидации параметров в библиотеке.
    Я в ревизии 7048 добавил проверку на максимальную длину строки с фильтром. Если фильтр больше чем 4кб то программа и OpenDialog теперь падать не должны. OpenDialog такой фильтр проигнорирует и запустится без фильтра. Вот только думаю что еще надо сделать какое-то предупреждение о том, что фильтр был забракован, это может быть или текст на доске отладки или окно notify.
  • Who is online

    Users browsing this forum: No registered users and 9 guests