;运行效果
;win32汇编环境,得到当前日期时间的例子
;有2个函数可以使用,GetLocalTime和GetSystemTime,一般用GetLocalTime,得到本地时间,GetSystemTime的是系统时间,也叫世界时,专业方向的人用,我们一般也用不上。
;下列示例得到本地时间,同时加定时器,每秒更新,看起来像有个时钟在运行的样子
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自定义函数声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
.data
DlgName db "MyDialog",0
szMsg db "提示",0
szFormat01 db "当前日期是:%d年%d月%d日 ",0
szWeek00 db " 星期日",0
szWeek01 db " 星期一",0
szWeek02 db " 星期二",0
szWeek03 db " 星期三",0
szWeek04 db " 星期四",0
szWeek05 db " 星期五",0
szWeek06 db " 星期六",0
szFormat02 db "当前时间是: %d:%d:%d",0
.data?
hInstance HINSTANCE ?
.const
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义
ICO_MAIN equ 1000 ;图标
IDC_VALUE01 equ 201
IDC_VALUE02 equ 202
ID_TIMER1 equ 1
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL
invoke ExitProcess,eax
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL @stTime:SYSTEMTIME ;定义1个名为@stTime的SYSTEMTIME 结构,里面包含了年、月、星期、天、小时、分钟、秒、毫秒这些成员,得到这些值后,直接使用就可以了
LOCAL @hYear,@hMonth,@hDay,@hWeek ;SYSTEMTIME结构中的wYear、wMonth这些成员是WORD 类型,就是2字节类型,所以定义时也用了WORD型
LOCAL @hHour,@hMinute,@hSecond
LOCAL @szBuffer[256]:byte
.if uMsg == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
invoke GetLocalTime,addr @stTime
invoke RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
xor eax,eax ;把eax清零,因为后面要取低2字节,需防止高2字节里有数据
mov ax,@stTime.wYear ;wYear、wMonth这些成员是WORD 类型,就是2字节类型,所以前面用ax对应2字节
mov @hYear,eax ;但是@hYear定义时默认的是DWORD型,即4字节,而上面的ax是2字节,不匹配,所以需用eax
xor eax,eax
mov ax,@stTime.wMonth
mov @hMonth,eax
xor eax,eax
mov ax,@stTime.wDay
mov @hDay,eax
invoke wsprintf,addr @szBuffer,addr szFormat01,@hYear,@hMonth,@hDay ;格式化年、月、日字符串到@szBuffer字符数组里去
mov bx,@stTime.wDayOfWeek ;wDayOfWeek是星期,但是数值,比如星期日是0,星期一是1,以此类推
.if bx == 0 ;如果是星期日,则把前面定义的星期日的字符串添加上去
invoke lstrcat,addr @szBuffer,addr szWeek00
.elseif bx == 1
invoke lstrcat,addr @szBuffer,addr szWeek01
.elseif bx == 2
invoke lstrcat,addr @szBuffer,addr szWeek02
.elseif bx == 3
invoke lstrcat,addr @szBuffer,addr szWeek03
.elseif bx == 4
invoke lstrcat,addr @szBuffer,addr szWeek04
.elseif bx == 5
invoke lstrcat,addr @szBuffer,addr szWeek05
.elseif bx == 6
invoke lstrcat,addr @szBuffer,addr szWeek06
.endif
invoke SetDlgItemText,hWnd,IDC_VALUE01,addr @szBuffer
invoke RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
mov ebx,ebx
mov bx,@stTime.wHour
mov @hHour,ebx
mov ebx,ebx
mov bx,@stTime.wMinute
mov @hMinute,ebx
mov ebx,ebx
mov bx,@stTime.wSecond
mov @hSecond,ebx
invoke wsprintf,addr @szBuffer,addr szFormat02,@hHour,@hMinute,@hSecond ;格式化时、分、秒字符串到@szBuffer字符数组里去
invoke SetDlgItemText,hWnd,IDC_VALUE02,addr @szBuffer
invoke SetTimer,hWnd,ID_TIMER1,1000,NULL ;设定每隔1秒触发的定时器
.elseif uMsg == WM_TIMER ;处理定时器消息
mov eax,wParam
.if eax == ID_TIMER1
invoke RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
invoke GetLocalTime,addr @stTime
mov ebx,ebx
mov bx,@stTime.wHour
mov @hHour,ebx
mov ebx,ebx
mov bx,@stTime.wMinute
mov @hMinute,ebx
mov ebx,ebx
mov bx,@stTime.wSecond
mov @hSecond,ebx
invoke wsprintf,addr @szBuffer,addr szFormat02,@hHour,@hMinute,@hSecond ;格式化时、分、秒字符串到@szBuffer字符数组里去
invoke SetDlgItemText,hWnd,IDC_VALUE02,addr @szBuffer
invoke GetDC,hWnd
.endif
.elseif uMsg == WM_CLOSE
invoke KillTimer,hWnd,ID_TIMER1 ;离开时记得清除定时器
invoke EndDialog, hWnd,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
;下面为rc文件内容
#include "resource.h" //提示缺少该文件,可以在资源里下载
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define ICO_MAIN 1000 //图标
#define IDC_VALUE01 201
#define IDC_VALUE02 202
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义对话框
MyDialog DIALOG 10, 10, 205, 150
STYLE DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "对话框程序模版"
FONT 12, "宋体"
BEGIN
LTEXT "0", IDC_VALUE01, 25, 50, 150, 8
LTEXT "0", IDC_VALUE02, 25, 80, 150, 8
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>