Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по программированию (от Ассемблера до Делфи)


Информационный Канал Subscribe.Ru

Низкоуровневый язык программирования Ассемблер

Использование функции MessageBox

Все программирование под Windows сводится к использованию API функций, будь то работа с файлами, окнами, сетью и т.д. Поэтому для написания программ вам потребуется знание API. Их описание вы можете найти в MSDN или в help файле от Borland Delphi (Win32 SDK Reference). Чтобы научиться использовать эти самые API рассмотрим простенькую функцию MessageBox. Ну-ка, взглянем на примерчик:


.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
szDlgTitle db "MASM", 0
szMsg db "Repeat this again?",0
szMsg2 db "Are you sure?", 0

.code

start:

invoke MessageBox, 0, addr szMsg, addr szDlgTitle, MB_RETRYCANCEL + MB_ICONINFORMATION
cmp eax, IDRETRY
je start

invoke MessageBox, 0, addr szMsg2, addr szDlgTitle, MB_YESNO
cmp eax, IDNO
je start

invoke ExitProcess, 0

end start

Первые три строчки довольно-таки стандартные в таких прогах, так что на них останавливаться не будем. Если вы не понимаете их смысл, то пока забудьте об их существовании - понимание придет позже. Строчки начинающиеся с include обозначают расположение библиотек и их описаний. По поводу вопроса "А где взять эти библиотеки?". Отвечаю: вам нужно найти MASMv7. В этом пакете есть все от примеров до редактора, в котором пишутся проги. Но так как дистрибутив весит 5 с копейками мегабайт мне запретили его выкладывать на сайте из-за ограничения на размер отдельного файла в 5 мегов. Единственное что сейчас могу сказать дак это попробовать поискать на сайте www.masm32.com .

Поехали дальше...В секции ".data" у нас объявляются переменные. В нашем примере их всего три. "szDlgTitle" - содержит заголовок выводимого диалогового бокса. Оставшиеся две несут в себе содержание выводимых окошечек.

А вот со строчки "start:" начинается самое интересное, то есть сама прога.
"invoke MessageBox, 0, addr szMsg, addr szDlgTitle, MB_RETRYCANCEL + MB_ICONINFORMATION" - после выполнения этой строчки появляется диалоговый бокс с заголовком szDlgTitle и с содержимым szMsg. То есть для того чтобы использовать функцию API необходимо в начале написать invoke, затем после пробела название функции и за ним через запятую указать все параметры функции.

Теперь поподробнее о самой функции. Ее описание в MSDN имеет вид:
int MessageBox(
HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);
Как вы видите это описание для тех кто программирует на C. Как следствие, нам надо поднатужиться и научиться его применять в Асм программах. Из первой строчки мы узнаем, что функция называется MessageBox :) и она в результате своего выполнения вернет какое-то число типа int. Если вы помните, в Асме нет типов ни int, ни char, ни double, ни ... А есть лишь byte, word и double word (а также еще парочка им подобных). Но на самом деле в языке С используются те же самые типы, что и в Асме, все отличие в названиях. И поэтому если вы знаете, что int это 32-ух разрядное число, то смело используйте double word (регистры eax, ebx, ...). UINT - 32-ух разрядное число, выводы делайте сами :). Что же касается LPCTSTR так это адрес на расположение в памяти строки, а так как адреса в 32-ух разрядных процессорах являются 32-ух разрядными, мы смело используем double word (регистры eax, ebx, ...). Все просто.

Таким образом в качестве первого параметра мы заносим 0, так как у нас нет родительского окна (handle of owner window). Далее нам нужно передать адрес строки, в которой содержится текст содержимого бокса, сделаем мы это так "addr szMsg" (переводя на русский - адрес переменной szMsg). Аналогично со следующим параметром. Теперь у нас остался uType - это как вы наверное догадались тип диалогового бокса. Все в том же MSDN или в хелпе от Borland'а дается целый список этих типов, но в данном случае мы используем только два - "MB_RETRYCANCEL + MB_ICONINFORMATION" - первый означает, что у бокса будет 2 кнопочки Retry и Cancel, а второй - отображение небольшой иконки со значком восклицательного знака.

Как уже было сказано (написано) функция MessageBox должна вернуть нам какое-то число. В данном случае этим числом является нажатая кнопочка, то есть если пользователь нажмет на Ok он получит результат IDOK, если на Cancel - IDCANCEL. Но опять же эти значения берутся из хелпа. Возвращаемое функцией значение заносится в регистр eax, таким образом в нашей программе мы поступаем так:
cmp eax, IDNO
je start
То есть сначала проверяем не равен ли eax IDNO и если он оказывается равен этому значению, то программа перейдет на метку старт или в начало. И, как я уже говорил, - все просто!

Последняя строчка программы: "invoke ExitProcess, 0" - вызывает функцию ExitProcess с параметром 0. Не сложно догадаться, что эта функция просто завершает выполнение нашей программы. В MSDN она имеет следующее описание:
VOID ExitProcess(
UINT uExitCode // exit code for all threads
);
В первой строчке содержится название функции ExitProcess и тип значения, которое она должна вернуть. Но как мы видим это тип - VOID. А это означает, что она нам ничего не вернет. Параметр uExitCode обозначет код выхода программы - если вам не интересно, что это такое, то просто закинте туда 0 и все будет нормально.

На этом я намереваюсь закончить этот урок. С вопросами обращайтесь по адресу evolverstation@narod.ru .

Исходный код программы, а также ее откомпилированная версия



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное