Перешёл на 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
main.obj
main.exe
sha-256.obj
.vscode/tasks.json.etalon
+43
View File
@@ -14,6 +14,42 @@ IncludeLib kernel32.lib
;IncludeLib debug.lib
.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
szAppName DB "SDI Application",0
MenuName DB "FirstMenu",0
@@ -21,13 +57,20 @@ szFileNew DB "You selected 'New'.",0
szFileOpen DB "You selected 'Open'.",0
szHelpAbout DB "You selected 'About'.",0
DU ButtonClassName,<button>
DU ButtonText,<Запуск>
.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hMenu HMENU ?
hwndButton HWND ?
.CONST
IDM_FILE_NEW EQU 1
IDM_FILE_OPEN EQU 2
IDM_HELP_ABOUT EQU 3
IDM_FILE_EXIT EQU 4
ButtonID equ 5
+25 -7
View File
@@ -13,10 +13,10 @@ Start:
Invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
Invoke ExitProcess,EAX
WinMain Proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
Local wc:WNDCLASSEX
Local wc:WNDCLASSEXW
Local msg:MSG
Local hwnd:HWND
MOV wc.cbSize, SizeOf WNDCLASSEX
MOV wc.cbSize, SizeOf WNDCLASSEXW
MOV wc.style, CS_HREDRAW or CS_VREDRAW
MOV wc.lpfnWndProc, Offset WndProc
MOV wc.cbClsExtra,NULL
@@ -31,10 +31,13 @@ Local hwnd:HWND
MOV wc.hIconSm,0
Invoke LoadCursor, NULL, IDC_ARROW
MOV wc.hCursor,EAX
Invoke RegisterClassEx, addr wc
Invoke LoadMenu, hInst, Offset MenuName
Invoke RegisterClassExW, addr wc
.if eax==NULL
Invoke MessageBox, NULL,ADDR szHelpAbout, Offset szAppName, MB_OK
.endif
Invoke LoadMenuW, hInst, Offset MenuName
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,\
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu,\
hInst, NULL
@@ -42,10 +45,10 @@ Local hwnd:HWND
Invoke ShowWindow, hwnd, SW_SHOWNORMAL
Invoke UpdateWindow, hwnd
.While TRUE
Invoke GetMessage, ADDR msg, NULL, 0, 0
Invoke GetMessageW, ADDR msg, NULL, 0, 0
.Break .If (!EAX)
Invoke TranslateMessage, ADDR msg
Invoke DispatchMessage, ADDR msg
Invoke DispatchMessageW, ADDR msg
.EndW
MOV EAX, msg.wParam
RET
@@ -55,6 +58,7 @@ WndProc Proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
Invoke PostQuitMessage, NULL
.ElseIf uMsg==WM_COMMAND
MOV EAX,wParam
.if lParam==0
.If AX==IDM_FILE_NEW
Invoke MessageBox, NULL, ADDR szFileNew, Offset szAppName, MB_OK
.ElseIf AX==IDM_FILE_OPEN
@@ -64,6 +68,20 @@ WndProc Proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.Else
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
Invoke DefWindowProc, hWnd, uMsg, wParam, lParam
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