Win32 ASM 菜单编程Demo以及Win32 ASM 为什么需要等值定义
使用Win32 ASM制作一个窗口菜单;
资源文件;
#define ICO_MAIN 0x1000 //图标
#define IDM_MAIN 0x2000 //菜单#define IDM_HELP 0x4301
#define IDM_ABOUT 0x4302
#define IDM_ADDWZ 0x5001
#define IDM_UPDATEWZ 0x5002
#define IDM_DELWZ 0x5003
#define IDM_QUERYWZ 0x5004
#define IDM_ADDCK 0x6001
#define IDM_UPDATECK 0x6002
#define IDM_DELCK 0x6003
#define IDM_QUERYCK 0x6004ICO_MAIN ICON "Main.ico"IDM_MAIN menu discardableBEGINpopup "物资信息"BEGINmenuitem "添加物资", IDM_ADDWZmenuitem "更新物资", IDM_UPDATEWZmenuitem "删除物资", IDM_DELWZmenuitem separatormenuitem "查询物资", IDM_QUERYWZENDpopup "仓库信息"BEGINmenuitem "添加仓库", IDM_ADDCKmenuitem "更新仓库", IDM_UPDATECKmenuitem "删除仓库", IDM_DELCKmenuitem separatormenuitem "查询仓库", IDM_QUERYCKENDpopup "帮助" ,HELPBEGINmenuitem "帮助主题", IDM_HELPmenuitem separatormenuitem "关于本程序...",IDM_ABOUTENDEND
asm文件;
; Win32 菜单 Demo,by bobo.386.model flat, stdcalloption casemap :noneinclude \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib; Equ 等值定义
ICO_MAIN equ 1000h ;图标
IDM_MAIN equ 2000h ;菜单
IDM_HELP equ 4301h
IDM_ABOUT equ 4302h
IDM_ADDWZ equ 0x5001
IDM_UPDATEWZ equ 0x5002
IDM_DELWZ equ 0x5003
IDM_QUERYWZ equ 0x5004
IDM_ADDCK equ 0x6001
IDM_UPDATECK equ 0x6002
IDM_DELCK equ 0x6003
IDM_QUERYCK equ 0x6004; 数据段.data?
hInstance dd ?
hWinMain dd ?
hMenu dd ?; 数据段.const
szClassName db 'MIS Menu Demo',0
szCaptionMain db 'MIS Menu ',0
szMenuHelp db '帮助主题',0
szMenuAbout db '关于本程序...',0
szCaption db '菜单选择',0
szFormat db '您选择了菜单命令:%08x',0; 代码段.code
_DisplayMenuItem proc _dwCommandIDlocal @szBuffer[256]:bytepushadinvoke wsprintf,addr @szBuffer,addr szFormat,_dwCommandIDinvoke MessageBox,hWinMain,addr @szBuffer,offset szCaption,MB_OKpopadret_DisplayMenuItem endp_Quit procinvoke DestroyWindow,hWinMaininvoke PostQuitMessage,NULLret_Quit endp_ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParammov eax,uMsg.if eax == WM_CREATE.elseif eax == WM_COMMANDinvoke _DisplayMenuItem,wParam.elseif eax == WM_CLOSEcall _Quit.elseinvoke DefWindowProc,hWnd,uMsg,wParam,lParamret.endif
;********************************************************************xor eax,eaxret_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proclocal @stWndClass:WNDCLASSEXlocal @stMsg:MSGlocal @hAcceleratorinvoke GetModuleHandle,NULLmov hInstance,eaxinvoke LoadMenu,hInstance,IDM_MAINmov hMenu,eax;********************************************************************
; 注册窗口类
;********************************************************************invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClassinvoke LoadIcon,hInstance,ICO_MAINmov @stWndClass.hIcon,eaxmov @stWndClass.hIconSm,eaxinvoke LoadCursor,0,IDC_ARROWmov @stWndClass.hCursor,eaxpush hInstancepop @stWndClass.hInstancemov @stWndClass.cbSize,sizeof WNDCLASSEXmov @stWndClass.style,CS_HREDRAW or CS_VREDRAWmov @stWndClass.lpfnWndProc,offset _ProcWinMainmov @stWndClass.hbrBackground,COLOR_WINDOW + 1mov @stWndClass.lpszClassName,offset szClassNameinvoke RegisterClassEx,addr @stWndClass
;********************************************************************
; 建立并显示窗口
;********************************************************************invoke CreateWindowEx,WS_EX_CLIENTEDGE,\offset szClassName,offset szCaptionMain,\WS_OVERLAPPEDWINDOW,\100,100,400,300,\NULL,hMenu,hInstance,NULLmov hWinMain,eaxinvoke ShowWindow,hWinMain,SW_SHOWNORMALinvoke UpdateWindow,hWinMain
;********************************************************************
; 消息循环
;********************************************************************.while TRUEinvoke GetMessage,addr @stMsg,NULL,0,0.break .if eax == 0invoke TranslateAccelerator,hWinMain,@hAccelerator,addr @stMsg.if eax == 0invoke TranslateMessage,addr @stMsginvoke DispatchMessage,addr @stMsg.endif.endwret_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:call _WinMaininvoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>end start
命令行构建:
G:\win32ASM\MISMenuDemo>set include=g:\masm32\include
G:\win32ASM\MISMenuDemo>set lib=g:\masm32\lib
G:\win32ASM\MISMenuDemo>set path=g:\masm32\bin;%path%
G:\win32ASM\MISMenuDemo>ml /c /coff wz.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997. All rights reserved.
Assembling: wz.asm
***********
ASCII build
***********
G:\win32ASM\MISMenuDemo>rc wz.rc
G:\win32ASM\MISMenuDemo>Link /subsystem:windows wz.obj wz.res
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
G:\win32ASM\MISMenuDemo>
结果;
资源文件里使用popup定义一个下拉出来的菜单项,下拉出来的菜单项包含在BEGIN...END里面,使用menuitem定义一个菜单项;
汇编代码有2个子过程;_DisplayMenuItem,显示单击的菜单标识值;_Quit,退出;
在主对话框过程里啥也没干;当单击菜单,收到WM_COMMAND消息,执行
invoke _DisplayMenuItem,wParam
显示单击的菜单标识值;
在资源文件里面定义了各菜单标识的值;在asm文件里面又定义了等值equ定义;这是啥情况;为什么要定义2次呢;云彬兄的Win32汇编程序里面也都包含这个equ等值定义;
搞C的时候,一般在resource.h文件里定义资源标识的值,然后包含resource.h就可以了;
因为汇编的时候各是各的,使用ml命令把asm汇编为obj文件时需要资源标识的值;rc文件是单独编译;使用rc命令把.rc文件编译为.RES文件的时候,也需要资源标识的值;这两次各是各的;
所以需要等值定义;只是在asm集成开发环境里,ml和rc它一次帮你执行了;代码里是需要equ定义的;
此处,消息循环里,
invoke TranslateAccelerator,hWinMain,@hAccelerator,addr @stMsg
这句不能删除;
Win32 ASM 菜单编程Demo以及Win32 ASM 为什么需要等值定义相关推荐
- Win32 ASM 简单对话框编程Demo
一. ASM基本对话框 asm文件: ;>>>>>>>>>>>>>>>>>>>> ...
- win32下Socket编程(1)
一.win32的socket编程,是socket编程中比较经典也比较基础的一部分,根据传输方式和协议的区别,可以简单的分为TCP传递和UDP传递两种.这篇文章主要是阐述基于TCP的Socket编程. ...
- win32,win64编程永恒;语言编程需要注意的64位
win32,win64编程永恒;语言编程需要注意的64位和32机器的区别 作者:拳拳的Blog | 出处:博客园 | 2011/12/10 7:17:51 | 阅读 79次 一.数据类型特别是int相 ...
- 【ASM学习】普通数据库向ASM实例的迁移(二)
--接着rman的做 在rman恢复时,数据库是mount状态的,这里需要将数据打开!ORCL>conn system/yang[@]orcl as sysdba 已连接. ORCL>al ...
- VC++学习(6):菜单编程
1. MFC中的顶层菜单默认为弹出菜单(Pop-up),它是不能用来作命令响应的,当取消Pop-up选项后可接受命令响应. 2. 消息的分类:标准消息,命令消息,通告消息. [ ...
- oracle asm和文件系统,Oracle工具之--ASM与文件系统及跨网络传输文件
Oracle工具之--ASM与文件系统及跨网络传输文件 Oracle DBMS_FILE_TRANSFER可以实现文件系统和ASM磁盘组之间实现文件传输及ASM磁盘组之间跨网络的传输. DBMS_FI ...
- 解决ORA-15097 Cannot shutdown ASM if OCR is Located in ASM
环境介绍: 数据库版本: oracle 11.2.0.1 数据库平台:所有平台 [@more@] 问题现象: 当你试图关闭ASM的时候,报以下错误: ORA-15097: cannot SHUTDOW ...
- CGLIB依赖ASM(关于java字节码框架ASM的学习)
本文转自: http://www.cnblogs.com/liuling/archive/2013/05/25/asm.html 一.什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生 ...
- RedHat5.2下Linux Oracle 10g ASM 安装详细实录-第二篇-ASM安装
五.安装ASM 1.在oracle网站下载支持包: http://www.oracle.com/technology ... x/asmlib/rhel5.html 2.根据linux内核下载相应的a ...
最新文章
- 前端javascript实现二进制读写操作
- 安装mysql-8.0.13-winx64遇到的问题和亲测有效的安装方法
- [云炬创业基础笔记]第二章创业者测试19
- 响应QML中的用户输入
- python临床数据_从临床试验中获取数据
- 华为root工具_华为手机EMUI9 ROOT通用操作方法
- Python-cvxopt库的使用(1)(解决LP问题)
- MySQL怎么查游戏内邮件附件_怎么查询游戏mysql账号密码
- iscsi-target
- eigen3.3.8帮助文档下载 chm_惠普7500A驱动下载-惠普hp 7500A打印机驱动下载 v28.8官方版...
- Python Numpy中reshape函数参数-1的含义
- 织梦支持php版本,DedeCMS不支持PHP5.3、5.4及以上版本后台500错误白屏的解决方法...
- redhat7的wget使用
- JAVA电影院售票系统毕业设计 开题报告
- pdf编辑工具linux,7个Ubuntu下的PDF编辑工具
- WORD中如何调整字间距
- ssm教务系统网站 毕业设计-附源码290915
- [CSP2020]儒略日
- 牛逼的人,都不太要面子
- DeFi中价值千万的关键字Gitcoin