Page 1 of 4

Message Box

Posted: Sat Mar 14, 2009 2:21 pm
by IgorA
Решил написать программу для вывода сообщений (или MessageBox).
Текст в окно передается через IPC сообщение.
В коде программы нужно объявить: заголовок, текст, подписи кнопок. Потом передать их окну :

Code: Select all

msgbox_2:
  dw 0
  db 'MBox 3 but',0
  db 'Example 3 buttons',0
  db 'Ok',0 ;button1
  db 'Cancel',0 ;button2
  db 'Help',0 ;button3
  db 0
.mb_end:
Подробный пример использования в файле use_mb.asm .
Скомпилированный пример в файле use_mb.kex .
---
Думаю что можно стандартизировать этот пример и использовать в любой программе.
Также жду замечаний и идей по доработке ...

Re: Message Box

Posted: Sun Mar 15, 2009 8:54 am
by Albom
отличная работа! но может лучше было создание MessageBox оформить в виде библиотеки (.obj)? так пользователям более привычно, чем IPC. а создание окна сделать, естественно, в отдельном потоеке...

Re: Message Box

Posted: Sun Mar 15, 2009 2:58 pm
by s1n
IgorA,
хорошая работа....

Albom,
поддерживаю... *.obj не помешал бы...

Re: Message Box

Posted: Sun Mar 15, 2009 5:48 pm
by Janik
IgorA, молодца, так держать!
*.obj не помешал бы...

Re: Message Box

Posted: Sun Mar 15, 2009 8:50 pm
by IgorA
Если сделать в библиотеке, то думаю будет удобнее использовать.
Сообщение должно давать ответ, какая кнопка нажата, а через IPC это не очень удобно будет сделать.
Надо будет над этим подумать, раньше пока еще не писал библиотеки.

Re: Message Box

Posted: Tue Mar 17, 2009 1:13 am
by IgorA
Хочу переписать код в библиотеку, а компилятор выдает ошибку на подобные строки :( :

Code: Select all

  mov esi,msgbox_1+MB_TEXT_OFFSET
.........
msgbox_1:
т. е. не дает адрес (смещение) переменной (или метки) msgbox_1 записать в регистр
Убираю из кода строки:

Code: Select all

format MS COFF
public EXPORTS
section '.flat' code readable align 16
компилируется нормально (но в бинарник, а мне нужно obj получить).
Кто знает как получить адрес, чтобы заработало ? Я так думаю, что когда создается библиотека переменные не имеют адресов, потому что не известно куда будет присоедина библиотека... а может я не прав ?

Re: Message Box

Posted: Tue Mar 17, 2009 1:33 am
by diamond
Полный код в студию. Сами по себе приведённые строчки должны скомпилироваться. Если в начале ранее выкладываемого исходника написать "format MS COFF / section '.flat' code readable align 16", то код прекрасно компилится в obj (хотя, разумеется, результат никак не является библиотекой).

Re: Message Box

Posted: Tue Mar 17, 2009 1:45 am
by IgorA
даю код.

Re: Message Box

Posted: Tue Mar 17, 2009 9:31 am
by Mario
IgorA
Нужно принудительно указывать размерность, вместо:

Code: Select all

mov edi,msgbox_1
сделать так:

Code: Select all

mov edi,dword msgbox_1
Ну, и так далее во всех местах где FASM ругается.

Re: Message Box

Posted: Tue Mar 17, 2009 10:24 am
by diamond
macros.inc делает замену для mov, которая не работает в случае компиляции в obj. Просто добавь "purge mov" после включения macros.inc.

Re: Message Box

Posted: Tue Mar 17, 2009 7:38 pm
by IgorA
все получилось :D
вот теперь через библиотеку сделал, и кроме того несколько доработок ...
код нажатой кнопки возвращается в вызвавшую программу

Re: Message Box

Posted: Wed Mar 18, 2009 10:35 am
by Albom
вот это другое дело! только во-первых, почему так запутанно? а во-вторых, может я и ошибаюсь, но экспортируемые функции не stdcall? а хотелось бы... и описания (или хотя бы прототипы) не помешали бы (хотя работающий пример уже хорошо).

Re: Message Box

Posted: Wed Mar 18, 2009 2:00 pm
by s1n
Albom, есть исходники же.. =)))... так что исправь как лучше будет...

Re: Message Box

Posted: Wed Mar 18, 2009 6:14 pm
by IgorA
Albom
функции не stdcall?
Т. е. параметры передаются не через стек? Это потому что я пока не очень хорошо знаю подходы программирования на asm, потому параметры давал через регистры. А в справочных документах обычно дается простое описание команд: какая что делает, без практических применений.
хотелось бы... и описания
описание дать могу, но для этого нужно некоторое время

Хорошо бы еще:
1) немного поменять алгоритм перемещения кнопками,
2) более точно вычислить координаты окна (ширину, и наверное в центр окна его надо)
3) продумать задержку выполнения программы, пока не будет нажата кнопка (т. е. создать модальное окно)
4) продумать как будет работать программа если нужно создать несколько сообщений
вобщем есть еще над чем подумать

Re: Message Box

Posted: Wed Mar 18, 2009 7:19 pm
by vkos
IgorA
По поводу stdcall и вообще библиотек можно посмотреть исходники libs-dev.