masm32之一个使用rc资源的窗口文件


简短记录一下masm下第一个使用rc资源编译的窗口文件

注:代码完全来自于某个博主的博客,当初也只是想着复制,编译链接,运行一下看看效果。

hello.rc

// 资源文件注释格式为双斜杠
// 包含资源头文件,以能使用头键字
#include    

// 指定对话框ID,asm文件中要定义同值变量才可引用
#define    DLG_HELLOWORLD    1

// 定义对话框结构
DLG_HELLOWORLD    DIALOG 350,200,213,164
STYLE                        DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION                    "Helloworld Program"
FONT                        11,"宋体"
{
    CTEXT    "Win32 Assembly Helloworld Program",-1,50,54,170,21
    CONTROL "",-1,"Static",SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE,6,79,203,1
    DEFPUSHBUTTON "quit",IDOK,158,86,50,21
}

没有学过资源文件编写相关,当初看感觉还有点懵,现在再看,感觉结构清晰,一看就知道哪个部分有什么效果。

hello.asm

; asm文件注释格式为分号
; 定义程序模式
.386
.model            flat,stdcall
option            casemap    :none

; 包含必要头文件,基本每个win32 汇编程序都需要包含这几个
include windows.inc
include  user32.inc
includelib user32.lib
include  kernel32.inc
includelib kernel32.lib

; 指定对话框ID,该ID要与rc文件中的ID值相同
; 理论上,asm文件与rc文件中的控件是通过ID值关联的,控件名并不需要与rc文件相同,不过为了易看一般取一样的
; 比如这里重点是equ 1,叫不叫DLG_HELLOWORLD无所谓,不过为了易看所以选择与rc文件保持一致
DLG_HELLOWORLD    equ    1

; 数据段
.data?
hInstance    dd    ?

; 代码段
.code
; 对话框处理过程
_ProcDlgHelloworld proc uses ebx edi esi hWnd,wMsg,wParam,lParam
    mov    eax,wMsg
    .if eax == WM_CLOSE
            invoke    EndDialog,hWnd,NULL
    .elseif eax == WM_INITDIALOG
            ;invoke    LoadIcon,hInstance,ICO_MAIN
            ;incoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
    .elseif eax == WM_COMMAND
            mov    eax,wParam
            .if ax == IDOK
                    invoke    EndDialog,hWnd,NULL
            .endif
    .else
            mov    eax,FALSE
            ret
    .endif
    mov    eax,TRUE
    ret
_ProcDlgHelloworld    endp

start:
    invoke    GetModuleHandle,NULL
    mov       hInstance,eax
    ; 弹出对话框,对话框与及处理过程在这里绑定
    invoke    DialogBoxParam,hInstance,DLG_HELLOWORLD,NULL,offset _ProcDlgHelloworld,NULL
    invoke    ExitProcess,NULL
    ; 指定程序入口点为start标识处
    end       start

编译链接过程:

C:\Users\17724\Desktop\318>rc hello.rc

C:\Users\17724\Desktop\318>ml -c -coff hello.asm
Microsoft (R) Macro Assembler Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: hello.asm

***********
ASCII build
***********

C:\Users\17724\Desktop\318>link -subsystem:windows hello.obj hello.RES
Microsoft (R) Incremental Linker Version 12.00.21005.1
Copyright (C) Microsoft Corporation.  All rights reserved.


C:\Users\17724\Desktop\318>hello.exe

C:\Users\17724\Desktop\318>