Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2011, 15:39   #1
Alex1991
Форумчанин
 
Аватар для Alex1991
 
Регистрация: 18.10.2008
Сообщений: 166
Вопрос Создание окна(asm) с использованием WinApi

Как можно создать главное окно программы на примере этого кода:

Код:
.386 
.model flat, stdcall 
ExitProcess PROTO      ,:DWORD 
MessageBoxA PROTO      ,:DWORD, :DWORD, :DWORD, :DWORD 
.data 
   MsgBoxCaption  db "Пример окна сообщения",0 
   MsgBoxText     db "Программировать на Ассемблере под Win32 очень просто!",0 
.const 
   NULL        equ  0 
   MB_OK    equ  0 
.code 
   Main: 
    INVOKE    MessageBoxA, NULL, ADDR MsgBoxText, ADDR MsgBoxCaption, MB_OK 
    INVOKE    ExitProcess, NULL 
   end Main
Какую функцию winapi нужно использовать ?
Может эту? :
Код:
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrev,  LPSTR lpCmd, int nShow)
{
//code
}
Alex1991 вне форума Ответить с цитированием
Старый 03.04.2011, 15:56   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

WinMain это точка входа.

а показаный вами асм код, сам по себе не создает окна, а вызывает стандартный диалог MessageBox(эта функция его и показывает и создает)

если надо свое собственное окно, то RegisterClass(Ex)+CreateWindow +цикл сообщений
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.04.2011, 16:03   #3
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

Для отображения окна, надо скачала зарегистрировать класс окна (заполнить структуру WNDCLASSEX и зарегистрировать RegisterClassEx) в точке входа, потом создать окно CrerateWindowEx, потом отобразить его, а дальше запустить бесконечный цикл, в котором будут приниматься и отправляться сообщения от окна оконной процедуре (WindowProc).
Более подробно об этом написано в цикле статей Icezelion'а на wasm.ru (в данный момент он почему то не работает).
Ibanez Wizard вне форума Ответить с цитированием
Старый 03.04.2011, 16:05   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вообще не обязательно именно Ex версии брать
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.04.2011, 17:59   #5
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вообще не обязательно именно Ex версии брать
Это я по привычке
Ibanez Wizard вне форума Ответить с цитированием
Старый 04.04.2011, 13:20   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Alex1991
Это на МАСМе написано для WinXP
Код:
.686P 
.model flat
includelib user32.lib
includelib kernel32.lib
include windows.inc
extern _imp__CreateWindowExA@48:dword
extern _imp__DefWindowProcA@16:dword
extern _imp__DispatchMessageA@4:dword
extern _imp__GetMessageA@16:dword
extern _imp__ExitProcess@4:dword
extern _imp__RegisterClassA@4:dword
.code
start:	xor ebx,ebx
	mov edi,offset wTitle
        mov esi,400000h
	push edi
	push ebx
	push COLOR_WINDOW+1
	push 10011h
	push ebx
	push esi
	push ebx
	push ebx
	push offset WndProc
	push ebx
	push esp
	call _imp__RegisterClassA@4
	push ebx	   
	push esi
        shl esi,9;esi=CW_USEDEFAULT
	push ebx	
	push ebx	
	push esi	
	push esi	
	push esi	
	push esi	
	push WS_OVERLAPPEDWINDOW + WS_VISIBLE
	push edi; szWinTitle			
	push edi; lpszClassName
	push ebx
	call _imp__CreateWindowExA@48	;создать окно
	mov ebp,esp
message_loop: push ebx  ;цикл обработки сообщений
	push ebx
	push ebx
	push ebp 
	call _imp__GetMessageA@16	
	push ebp
	call _imp__DispatchMessageA@4     ;вернуть управление Windows        
	jmp short message_loop
WndProc:
        cmp dword ptr [esp+8],WM_DESTROY;Msg,WM_DESTROY
	je short @@WM_DESTROY
        jmp _imp__DefWindowProcA@16   ;все сообщения, не обрабатываемые в функции WndProc, направляются на обработку по умолчанию	
@@WM_DESTROY: push ebx    ;завершение программы
	call _imp__ExitProcess@4	
.data
	wTitle 	db 	'Iczelion Tutorial #3:A Simple Window in masm',0
end start
Ibanez Wizard
Всё на WASM.RU/FORUM работает

Последний раз редактировалось Mikl___; 04.04.2011 в 13:55.
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаленное управлени компом с использованием WinApi helpprogramh Win Api 3 02.04.2011 22:49
Asm-WinApi-trackbar lestor Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 30.03.2011 10:59
winapi и форма окна bulldog5293 Общие вопросы Delphi 4 26.09.2010 23:24
окна произвольной формы winApi alex_triton Visual C++ 7 26.08.2010 07:43