OpenDialog
-
Не подскажите как из своей программы запустить OpenDialog. И получить путь к выбранному файлу.
Пример в 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: Добро пожаловать на форум)
PS: Добро пожаловать на форум)
Чем больше сыра, тем больше в нём дыр. Чем больше дыр, тем меньше в нём собственно сыра. Значит, чем больше сыра, тем меньше сыра!
Спасибо. Сейчас посмотрю !
Я потратил сегодня порядка 3-4 часов пытаясь разобраться почему падает OpenDialog. Опишу ситуацию.
OpenDialog вызывается из С-- программ штатным способом и проблем с ним не было до теперешнего момента.
Сейчас он падает при увеличении размера программы.
Во вложении два файла, падучий и нет. Разница в коде вот http://prntscr.com/gss2u1
(вообще будет падать даже если убрать ="", но добавить #include "../lib/collection.h")
Я уже ненавижу это OpenDialog.
Очень нужна помощь понять в чем причина.
OpenDialog вызывается из С-- программ штатным способом и проблем с ним не было до теперешнего момента.
Сейчас он падает при увеличении размера программы.
Во вложении два файла, падучий и нет. Разница в коде вот http://prntscr.com/gss2u1
(вообще будет падать даже если убрать ="", но добавить #include "../lib/collection.h")
Я уже ненавижу это OpenDialog.
Очень нужна помощь понять в чем причина.
- Attachments
-
-
Calypte_crash (18.68 KiB)Downloaded 391 times
-
Calypte_normal (16.68 KiB)Downloaded 396 times
-
Из хаоса в космос
Leency, информации недостаточно.
Скорее всего, даже не в OpenDialog дело.
Компилятор в зависимости от объявления\инициализации openfile_path размещает данные в соответствующих секциях(.bss или .text).
Попробуй размер стека увеличить, может его реально было мало.
Возможно, неправильно заполняется структура OpenDialog, посмотри как в других программах, например, в RUN http://websvn.kolibrios.org/filedetails ... 9#line-270
Скорее всего, даже не в OpenDialog дело.
Компилятор в зависимости от объявления\инициализации openfile_path размещает данные в соответствующих секциях(.bss или .text).
Попробуй размер стека увеличить, может его реально было мало.
Возможно, неправильно заполняется структура OpenDialog, посмотри как в других программах, например, в RUN http://websvn.kolibrios.org/filedetails ... 9#line-270
У меня оба примера зависают при попытке что-либо открыть. Запустил в Debug-ере и вот что он выдает:
видимо лезет не туда куда надо.
Еще хотелось бы узнать из EFLAGS какое состояние флага df, может оно копирует не в ту сторону что надо.
зависает при копировании памяти Code: Select all
rep movsb
Еще хотелось бы узнать из EFLAGS какое состояние флага df, может оно копирует не в ту сторону что надо.
Сорри, я ничего не понял. Объясни.
Из хаоса в космос
Команды rep movsb используются для копирования кусков памяти, в
ecx - число операций копирования
edi - адрес приемника (куда копируется)
esi - адрес источника (откуда берется)
df - флаг направления копирования
На картинке edi = 1c000 (16) = 114688 (10), тогда как в программе памяти 1024*100 = 102400 (10) байт.
Желательно было-бы вычислить что там за функции такие, они вроди как бы ассемблерные а не С--. Может в саму функцию заходит не корректное значение.
ecx - число операций копирования
edi - адрес приемника (куда копируется)
esi - адрес источника (откуда берется)
df - флаг направления копирования
На картинке edi = 1c000 (16) = 114688 (10), тогда как в программе памяти 1024*100 = 102400 (10) байт.
Желательно было-бы вычислить что там за функции такие, они вроди как бы ассемблерные а не С--. Может в саму функцию заходит не корректное значение.
Даже если поставить MEMSIZE 1024*700 программа все равно падает.
Замечу, что у меня alloc_mem == x86esp_reg
В то время как я видел в других программах, что данные для работы opendial размещают после I_END. Например, RTFREAD http://prntscr.com/gt4m77
Может быть в этом проблема?
Замечу, что у меня 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];
Может быть в этом проблема?
- Attachments
-
-
Calypte_1024x700 (15.15 KiB)Downloaded 384 times
-
Из хаоса в космос
кажись есть хорошие новости, нашел в файле opendial.mac строки 346-368 то что выдает Debug-ер:
Кажись понял причину, зависает на функции get_filter_data, при попытке загрузить фильтр в OpenDialog. В фильтре должна быть длинна фильтра (4 байта) а потом текст фильтра. В С-- файле идет фильтр:
а длинны фильтра нет и следовательно "TXT",0 распознается как длинна фильтра.
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
Code: Select all
od_filter filter2 = { "TXT",0};
IgorA
Спасибо, что разобрался! Это правда было очень важно для меня, т.к. я потратил кучу сил на эту проблему и было прям чувство, что перегорел. Теперь понятно, это была моя ошибка. Можно продолжить разработку
Спасибо, что разобрался! Это правда было очень важно для меня, т.к. я потратил кучу сил на эту проблему и было прям чувство, что перегорел. Теперь понятно, это была моя ошибка. Можно продолжить разработку
Из хаоса в космос
Ну а я что говорил?
0CodErr wrote:неправильно заполняется структура OpenDialog, посмотри как в других программах
А ведь можно было просто посмотреть рабочий вариант в других программах.Leency wrote: я потратил кучу сил
Если бы ты запустил Debugger(а ты вряд ли это делал), то скорее всего обнаружил бы, посмотрев на edi, что и этого мало.Leency wrote:Даже если поставить MEMSIZE 1024*700 программа все равно падает.
Проблема глубже - в отсутствии валидации параметров в библиотеке.
Я в ревизии 7048 добавил проверку на максимальную длину строки с фильтром. Если фильтр больше чем 4кб то программа и OpenDialog теперь падать не должны. OpenDialog такой фильтр проигнорирует и запустится без фильтра. Вот только думаю что еще надо сделать какое-то предупреждение о том, что фильтр был забракован, это может быть или текст на доске отладки или окно notify.Siemargl wrote:Проблема глубже - в отсутствии валидации параметров в библиотеке.
Who is online
Users browsing this forum: No registered users and 5 guests