Перешёл на masm

This commit is contained in:
Стас Михайлов WindowsDesktop
2021-01-03 17:49:52 +03:00
parent e48e940485
commit ccfb9de3e7
4 changed files with 114 additions and 16 deletions
+2
View File
@@ -1,3 +1,5 @@
.vscode/tasks.json .vscode/tasks.json
main.obj main.obj
main.exe main.exe
sha-256.obj
.vscode/tasks.json.etalon
+43
View File
@@ -14,6 +14,42 @@ IncludeLib kernel32.lib
;IncludeLib debug.lib ;IncludeLib debug.lib
.DATA .DATA
;Макросы
MAKELANGID macro p:REQ,s:REQ ;Макрос создающий идентификатор языка
m$__langid = (s SHL 10) or p ;
EXITM <m$__langid> ;
endm
; -------------------------------------------------------------------------
DU MACRO name, string
name PROC
DU1 string
name ENDP
ENDM
; -------------------------------------------------------------------------
DU1 MACRO string
LOCAL bslash
bslash=0
IRPC c,<string>
IF bslash EQ 0
IF '&c' EQ "\" ;;управляющая последовательность символов
bslash=1
ELSEIF '&c' GT 127
DB ('&c'- 0B0h), 4 ;;кириллица
ELSE
DW '&c' ;;латиница
ENDIF
ELSE
bslash=0
IF '&c' EQ "n" ;; \n = новая строка
DW 0Dh
ELSEIF '&c' EQ "r";; \r = возврат каретки
DW 0Ah
ENDIF
ENDIF
ENDM
DW 0
ENDM
; -------------------------------------------------------------------------
ClassName DB "MainWinClass",0 ClassName DB "MainWinClass",0
szAppName DB "SDI Application",0 szAppName DB "SDI Application",0
MenuName DB "FirstMenu",0 MenuName DB "FirstMenu",0
@@ -21,13 +57,20 @@ szFileNew DB "You selected 'New'.",0
szFileOpen DB "You selected 'Open'.",0 szFileOpen DB "You selected 'Open'.",0
szHelpAbout DB "You selected 'About'.",0 szHelpAbout DB "You selected 'About'.",0
DU ButtonClassName,<button>
DU ButtonText,<Запуск>
.DATA? .DATA?
hInstance HINSTANCE ? hInstance HINSTANCE ?
CommandLine LPSTR ? CommandLine LPSTR ?
hMenu HMENU ? hMenu HMENU ?
hwndButton HWND ?
.CONST .CONST
IDM_FILE_NEW EQU 1 IDM_FILE_NEW EQU 1
IDM_FILE_OPEN EQU 2 IDM_FILE_OPEN EQU 2
IDM_HELP_ABOUT EQU 3 IDM_HELP_ABOUT EQU 3
IDM_FILE_EXIT EQU 4 IDM_FILE_EXIT EQU 4
ButtonID equ 5
+34 -16
View File
@@ -13,10 +13,10 @@ Start:
Invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT Invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
Invoke ExitProcess,EAX Invoke ExitProcess,EAX
WinMain Proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD WinMain Proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
Local wc:WNDCLASSEX Local wc:WNDCLASSEXW
Local msg:MSG Local msg:MSG
Local hwnd:HWND Local hwnd:HWND
MOV wc.cbSize, SizeOf WNDCLASSEX MOV wc.cbSize, SizeOf WNDCLASSEXW
MOV wc.style, CS_HREDRAW or CS_VREDRAW MOV wc.style, CS_HREDRAW or CS_VREDRAW
MOV wc.lpfnWndProc, Offset WndProc MOV wc.lpfnWndProc, Offset WndProc
MOV wc.cbClsExtra,NULL MOV wc.cbClsExtra,NULL
@@ -31,10 +31,13 @@ Local hwnd:HWND
MOV wc.hIconSm,0 MOV wc.hIconSm,0
Invoke LoadCursor, NULL, IDC_ARROW Invoke LoadCursor, NULL, IDC_ARROW
MOV wc.hCursor,EAX MOV wc.hCursor,EAX
Invoke RegisterClassEx, addr wc Invoke RegisterClassExW, addr wc
Invoke LoadMenu, hInst, Offset MenuName .if eax==NULL
Invoke MessageBox, NULL,ADDR szHelpAbout, Offset szAppName, MB_OK
.endif
Invoke LoadMenuW, hInst, Offset MenuName
MOV hMenu,EAX MOV hMenu,EAX
Invoke CreateWindowEx, WS_EX_CLIENTEDGE, ADDR ClassName, ADDR szAppName,\ Invoke CreateWindowExW, WS_EX_CLIENTEDGE, Offset ClassName, Offset szAppName,\
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,\ WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,\
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu,\ CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu,\
hInst, NULL hInst, NULL
@@ -42,10 +45,10 @@ Local hwnd:HWND
Invoke ShowWindow, hwnd, SW_SHOWNORMAL Invoke ShowWindow, hwnd, SW_SHOWNORMAL
Invoke UpdateWindow, hwnd Invoke UpdateWindow, hwnd
.While TRUE .While TRUE
Invoke GetMessage, ADDR msg, NULL, 0, 0 Invoke GetMessageW, ADDR msg, NULL, 0, 0
.Break .If (!EAX) .Break .If (!EAX)
Invoke TranslateMessage, ADDR msg Invoke TranslateMessage, ADDR msg
Invoke DispatchMessage, ADDR msg Invoke DispatchMessageW, ADDR msg
.EndW .EndW
MOV EAX, msg.wParam MOV EAX, msg.wParam
RET RET
@@ -55,15 +58,30 @@ WndProc Proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
Invoke PostQuitMessage, NULL Invoke PostQuitMessage, NULL
.ElseIf uMsg==WM_COMMAND .ElseIf uMsg==WM_COMMAND
MOV EAX,wParam MOV EAX,wParam
.If AX==IDM_FILE_NEW .if lParam==0
Invoke MessageBox, NULL, ADDR szFileNew, Offset szAppName, MB_OK .If AX==IDM_FILE_NEW
.ElseIf AX==IDM_FILE_OPEN Invoke MessageBox, NULL, ADDR szFileNew, Offset szAppName, MB_OK
Invoke MessageBox, NULL, ADDR szFileOpen, Offset szAppName, MB_OK .ElseIf AX==IDM_FILE_OPEN
.ElseIf AX==IDM_HELP_ABOUT Invoke MessageBox, NULL, ADDR szFileOpen, Offset szAppName, MB_OK
Invoke MessageBox, NULL,ADDR szHelpAbout, Offset szAppName, MB_OK .ElseIf AX==IDM_HELP_ABOUT
.Else Invoke MessageBox, NULL,ADDR szHelpAbout, Offset szAppName, MB_OK
Invoke DestroyWindow, hWnd .Else
.EndIf Invoke DestroyWindow, hWnd
.EndIf
.ELSE
.IF ax==ButtonID ;Если нажата кнопка, то
shr eax,16 ;сдвигаем EAX на 4 бита вправо, чтобы поместить в AX значение верхнего слова wParam
.IF ax==BN_CLICKED
invoke MessageBoxExW, hWnd, ADDR ButtonText, ADDR ButtonText,MB_OK,MAKELANGID(LANG_NEUTRAL,SUBLANG_SYS_DEFAULT)
.ENDIF
.EndIf
.ENDIF
.ELSEIF uMsg==WM_CREATE
invoke CreateWindowExW,NULL, Offset ButtonClassName,Offset ButtonText,\
WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
75,70,140,25,hWnd,ButtonID,hInstance,NULL
mov hwndButton,eax
.Else .Else
Invoke DefWindowProc, hWnd, uMsg, wParam, lParam Invoke DefWindowProc, hWnd, uMsg, wParam, lParam
RET RET
+35
View File
@@ -0,0 +1,35 @@
.386
.model flat,stdcall
option casemap:none
include include\windows.inc
include include\user32.inc
include include\kernel32.inc
includelib user32
includelib kernel32
.data
AppName db "DLL Skeleton",0
HelloMsg db "Hello, you're calling a function in this DLL",0
LoadMsg db "The DLL is loaded",0
UnloadMsg db "The DLL is unloaded",0
ThreadCreated db "A thread is created in this process",0
ThreadDestroyed db "A thread is destroyed in this process",0
.code
DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
.if reason==DLL_PROCESS_ATTACH
invoke MessageBox,NULL,addr LoadMsg,addr AppName,MB_OK
.elseif reason==DLL_PROCESS_DETACH
invoke MessageBox,NULL,addr UnloadMsg,addr AppName,MB_OK
.elseif reason==DLL_THREAD_ATTACH
invoke MessageBox,NULL,addr ThreadCreated,addr AppName,MB_OK
.else ; DLL_THREAD_DETACH
invoke MessageBox,NULL,addr ThreadDestroyed,addr AppName,MB_OK
.endif
mov eax,TRUE
ret
DllEntry Endp
TestHello proc
invoke MessageBox,NULL,addr HelloMsg,addr AppName,MB_OK
ret
TestHello endp
End DllEntry