用匯編寫界面當然是自己折騰自己~
首先是定義
Includelib Kernel32.Lib
Includelib Advapi32.Lib
Includelib User32.Lib
Includelib Gdi32.Lib
IncludeLib ComCtl32.Lib
EXTERN wsprintfA:PROC
EXTERN RtlZeroMemory:PROC
EXTERN MessageBoxA:PROC
EXTERN LoadIconA:PROC
EXTERN LoadCursorA:PROC
EXTERN GetModuleHandleA:PROC
EXTERN SendMessageA:PROC
EXTERN InitCommonControls:PROC
EXTERN DialogBoxParamA:PROC
EXTERN EndDialog:PROC
.DATA
szInfo BYTE "Hi",0
szTrueExit BYTE "Quit Now?",0
.DATA?
hInstance QWORD ?
hIcon QWORD ?
入口點 DialogBoxParamA有五個參數,所以最後一個還要通過堆棧的形式傳遞
Entry PROC
push rdi
sub rsp,30H
xor rcx,rcx
call GetModuleHandleA
mov hInstance,rax
call InitCommonControls
mov rcx,hInstance
mov rdx,IDD_DLG
xor r8,r8
lea r9,DlgProc
xor rax,rax
mov [rsp+20H],rax
call DialogBoxParamA
add rsp, 30h
pop rdi
xor rax,rax
ret
Entry ENDP
對話框處理函數 保存rcx rdx r8 r9四個寄存器
DlgProc PROC
mov [rsp+8H],rcx
mov [rsp+10H],rdx
mov [rsp+18H],r8
mov [rsp+20H],r9
push rdi
sub rsp, 20H
cmp rdx,WM_INITDIALOG
je @DlgInit
cmp rdx,WM_CLOSE
je @DlgClose
cmp rdx,WM_COMMAND
je @DlgCommand
add rsp, 20H
pop rdi
mov rax, FALSE
ret
@DlgClose:
xor rax,rax
mov eax,BN_CLICKED
shl eax,16
mov ax,IDC_BTNOK
mov rcx,[rsp+20H+8+8]
mov rdx,WM_COMMAND
mov r8,rax
xor r9,r9
call SendMessageA
jmp @Exit
@DlgInit:
jmp @Exit
@DlgCommand:
cmp r8,IDC_BTNOK
jne @Exit
mov rcx,[rsp+20H+8+8]
lea rdx,szTrueExit
lea r8,szInfo
mov r9,MB_YESNO or MB_ICONQUESTION
call MessageBoxA
cmp rax,IDYES
jne @Exit
mov rcx,[rsp+20H+8+8]
xor rdx,rdx
call EndDialog
jmp @Exit
@Exit:
add rsp, 20h
pop rdi
mov rax,TRUE
ret
DlgProc ENDP