win32 masm 02

 .386
.model flat, stdcall
option casemap:none

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

include    ../../include/windows.inc
include    ../../include/user32.inc
include    ../../include/kernel32.inc
include    ../../include/comdlg32.inc
includelib ../../lib/user32.lib
includelib ../../lib/kernel32.lib
includelib ../../lib/comdlg32.lib

.const
IDM_OPEN equ 3000
IDM_SAVE equ 3001
IDM_EXIT equ 3002
MAXSIZE  equ 260
MEMSIZE  equ 65535
EditID   equ 5000

.data
ClassName db "Win32ASMEditClass", 0
AppName   db "Win32 ASM Edit"   , 0
EditClass db "edit"             , 0
MenuName  db "FirstMenu"        , 0
ofn OPENFILENAME <>
FilterString db "All Files(*.*)"   , 0, "*.*"  , 0
             db "Text Files(*.txt)", 0, "*.txt", 0
buffer db MAXSIZE dup(0)

.data?
hInstance     HINSTANCE ?
CommandLine   LPSTR     ?
hwndEdit      HWND      ?
hFile         HANDLE    ?
hMemory       HANDLE    ?
pMemory       DWORD     ?
SizeReadWrite DWORD     ?

.code
start:
    invoke GetModuleHandle, NULL
    mov hInstance, eax
    invoke GetCommandLine
    mov CommandLine, eax
    invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
    invoke ExitProcess, eax
   
    WinMain proc hInst: HINSTANCE, hPrevInstance: HINSTANCE, CmdLine: LPSTR, CmdShow: DWORD
        LOCAL wc  : WNDCLASSEX
        LOCAL msg : MSG
        LOCAL hwnd: HWND
       
        mov wc.cbSize, SIZEOF WNDCLASSEX
        mov wc.style, CS_HREDRAW or CS_VREDRAW
        mov wc.lpfnWndProc, OFFSET WndProc
        mov wc.cbClsExtra, NULL
        mov wc.cbWndExtra, NULL
        push hInst
        pop wc.hInstance
        mov wc.hbrBackground, COLOR_WINDOW + 1
        mov wc.lpszMenuName, OFFSET MenuName
        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
        invoke CreateWindowEx, WS_EX_CLIENTEDGE, addr ClassName, addr AppName, WS_OVERLAPPEDWINDOW, /
                               CW_USEDEFAULT, CW_USEDEFAULT, 300, 200, NULL, NULL, hInst, NULL
        mov hwnd, eax
        invoke ShowWindow, hwnd, SW_SHOWNORMAL
        invoke UpdateWindow, hwnd
        .WHILE TRUE
            invoke GetMessage, addr msg, NULL, 0, 0
            .BREAK .IF (!eax)
            invoke TranslateMessage, addr msg
            invoke DispatchMessage, addr msg
        .ENDW
        mov eax, msg.wParam
        ret
    WinMain endp
   
    WndProc proc uses ebx hWnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM
        .IF uMsg == WM_CREATE
            invoke CreateWindowEx, NULL, addr EditClass, NULL, /
                                   WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or ES_AUTOHSCROLL or ES_AUTOVSCROLL, /
                                   0, 0, 0, 0, hWnd, EditID, hInstance, NULL
            mov hwndEdit, eax
            invoke SetFocus, hwndEdit
            ;======================================================================================
            ;      Initialize the members of OPENFILENAME structure
            ;======================================================================================
            mov ofn.lStructSize, SIZEOF ofn
            push hWnd
            pop ofn.hWndOwner
            push hInstance
            pop ofn.hInstance
            mov ofn.lpstrFilter, OFFSET FilterString
            mov ofn.lpstrFile, OFFSET buffer
            mov ofn.nMaxFile, MAXSIZE
        .ELSEIF uMsg == WM_SIZE
            mov eax, lParam
            mov edx, eax
            shr edx, 16
            and eax, 0FFFFh
            invoke MoveWindow, hwndEdit, 0, 0, eax, edx, TRUE
        .ELSEIF uMsg == WM_DESTROY
            invoke PostQuitMessage, NULL
        .ELSEIF uMsg == WM_COMMAND
            mov eax, wParam
            .IF lParam == 0
                .IF ax == IDM_OPEN
                    mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
                    invoke GetOpenFileName, addr ofn
                    .IF eax == TRUE
                        invoke CreateFile, addr buffer, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, /
                                           NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL
                        mov hFile, eax
                        invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MEMSIZE
                        mov hMemory, eax
                        invoke GlobalLock, hMemory
                        mov pMemory, eax
                        invoke ReadFile, hFile, pMemory, MEMSIZE - 1, addr SizeReadWrite, NULL
                        invoke SendMessage, hwndEdit, WM_SETTEXT, NULL, pMemory
                        invoke CloseHandle, hFile
                        invoke GlobalUnlock, pMemory
                        invoke GlobalFree, hMemory
                    .ENDIF
                    invoke SetFocus, hwndEdit
                .ELSEIF ax == IDM_SAVE
                    mov ofn.Flags, OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
                    invoke GetSaveFileName, addr ofn
                    .IF eax == TRUE
                        invoke CreateFile, addr buffer, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, /
                                           NULL, CREATE_NEW, FILE_ATTRIBUTE_ARCHIVE, NULL
                        mov hFile, eax
                        invoke GlobalAlloc, GMEM_MOVEABLE or GMEM_ZEROINIT, MEMSIZE
                        mov hMemory, eax
                        invoke GlobalLock, hMemory
                        mov pMemory, eax
                        invoke SendMessage, hwndEdit, WM_GETTEXT, MEMSIZE - 1, pMemory
                        invoke WriteFile, hFile, pMemory, eax, addr SizeReadWrite, NULL
                        invoke GlobalHandle, hFile
                        invoke GlobalUnlock, pMemory
                        invoke GlobalFree, hMemory
                    .ENDIF
                    invoke SetFocus, hwndEdit
                .ELSE
                    invoke DestroyWindow, hWnd
                .ENDIF
            .ENDIF
        .ELSE
            invoke DefWindowProc, hWnd, uMsg, wParam, lParam
            ret
        .ENDIF
        xor eax, eax
        ret
    WndProc endp
end start

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值