• (Masm) duda sobre codigo

 #63182  por InTRuDer^
 28 Mar 2009, 01:37
Me baje el Masm y tengo una duda con lo siguiente:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib ; llamadas a las funciones en user32.lib y kernel32.lib
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

.DATA ; data inicializada
ClassName db "SimpleWinClass",0 ; el nombre de nuestra clase de ventana
AppName db "Our First Window",0 ; el nombre de nuestra ventana

.DATA? ; data no inicializada
hInstance HINSTANCE ? ; manejador de instancia de nuestro programa
CommandLine LPSTR ?
.CODE ; Aquí comienza nuestro código
start:
invoke GetModuleHandle, NULL ; obtener el manejador de instancia del programa.
; En Win32, hmodule==hinstance

mov hInstance,eax
invoke GetCommandLine ; Obtener la línea de comando. No hay que llamar esta función
; si el programa no procesa la línea de comando
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ; llamar la función principal
invoke ExitProcess, eax ; quitar nuestro programa. El código de salida es devuelto en eax desde WinMain.

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX ; crear variables locales en la pila (stack)
LOCAL msg:MSG
LOCAL hwnd:HWND

mov wc.cbSize,SIZEOF WNDCLASSEX ; Llenar los valores de los miembros de wc
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc ; registrar nuestra clase de ventana
invoke CreateWindowEx,NULL,\
ADDR ClassName,\
ADDR AppName,\
WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
CW_USEDEFAULT,\
NULL,\
NULL,\
hInst,\
NULL
mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow ; desplegar nuestra ventana en el escritorio
invoke UpdateWindow, hwnd ; refrescar el area cliente

.WHILE TRUE ; Introducir en bucle (loop) de mensajes
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam ; Regresar el código de salida en eax
ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY ; si el usuario cierra nuestra ventana
invoke PostQuitMessage,NULL ; quitar nuestra aplicación
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ; Procesar el mensaje por defecto
ret
.ENDIF
xor eax,eax
ret
WndProc endp

end start
[ Debe registrarse para ver este enlace ]
invoke ExitProcess, eax
llama a esta api, el programa no deberia detenerse aca y salir a windows?
sin embargo veo que la ventana aprece y el programa sigue funcionado
cosa del autor... pero a que se debe esto??

saludos!!
 #63189  por Thor
 28 Mar 2009, 02:41
Porque antes de llegar ahí se queda en el bucle de mensajes de WinMain.
Código: [ Debe registrarse para ver este enlace ]
.WHILE TRUE ; Introducir en bucle (loop) de mensajes
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
Sale del bucle si eax es 0, es decir cuando GetMessage devuelva 0.
[ Debe registrarse para ver este enlace ]
Return Value
If the function retrieves a message other than WM_QUIT, the return value is nonzero.
If the function retrieves the WM_QUIT message, the return value is zero.
Así que sale del bucle y llega a ExitProcess cuando recibe el mensaje WM_QUIT, es decir cuando cierras la ventanita.