;运行效果
;win32汇编环境,对话框中使用IP地址控件示例
;演示了如何设置IP控件的IP地址,取得IP控件的地址值的操作,并解释了其原理
;也可以使用编辑框控件代替,但是需要写更多的东西,比如需要输入数值是否超255,但IP地址控件不用,它已经封装了这些自检功能
;直接抄进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 ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义
ICO_MAIN equ 1000 ;图标
IDC_IPA1 equ 1001
ID_BUTTON01 equ 41
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
.data
DlgName db "MyDialog",0
szMsg db "提示",0
szFMR db "取得的IP地址是 %d.%d.%d.%d",0
.data?
hInstance HINSTANCE ?
hW_IP HWND ? ;IP地址控件的句柄
nGetIP dd ? ;存放从IP地址控件取得的值的指针
.const
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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 @szBuffer[256]:byte
LOCAL @IP_addr1,@IP_addr2,@IP_addr3,@IP_addr4
.if uMsg == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
invoke GetDlgItem,hWnd,IDC_IPA1 ;得到IP地址控件的句柄
mov hW_IP,eax
;IP地址控件内的值,是1个32位的数。其中每8位占一个值,最高的字节为IP地址的开头值,最低的字节为结束值。以下面的IP地址:192.168.1.1为例。
;先把低2个字节的值即192和168赋值,然后用 shl 指令往左移位16位,就是占了高2位字节的位置,再把IP地址的后面两个值给它加上
mov ah,192
mov al,168
shl eax,16
mov ah,1
mov al,1
invoke SendMessage,hW_IP,IPM_SETADDRESS,0,eax ;初始化设置控件里的IP地址值
.elseif uMsg==WM_COMMAND
mov eax,wParam
.if eax == ID_BUTTON01
;以下是如何取得IP控件的地址值,IPM_GETADDRESS消息是取得地址值,但是它会放在一个所指向的DOWRD值的指针里。下面的 nGetIP 得到的值是一个指针,是一个指向某个DWORD的值的指针,并不是IP地址值,这个DWORD的值才是IP地址值
;所以要通过这个指针得到IP地址值的每个字段的数值
;就是说,这个nGetIP指向的内存地址里,有一个4字节的值,这个值就是IP控件的地址值
;然后,我们按字节取出值,比如这里的示例192.168.1.1,左边的是高字节,右边的是低字节
invoke SendMessage,hW_IP,IPM_GETADDRESS,0,offset nGetIP ;取出IP地址控件里的值的指针,并把这个指针值放在nGetIP里
mov bl,byte ptr [nGetIP+3] ;取出192这个值
movzx ebx,bl ;把ebx里面除了bl的值外都置0,因为不清楚bl前面的值是什么
mov @IP_addr1,ebx
mov bl,byte ptr [nGetIP+2] ;取出168这个值,后面以此类推
movzx ebx,bl
mov @IP_addr2,ebx
mov bl,byte ptr [nGetIP+1]
movzx ebx,bl
mov @IP_addr3,ebx
mov bl,byte ptr [nGetIP]
movzx ebx,bl
mov @IP_addr4,ebx
invoke wsprintf,addr @szBuffer,addr szFMR, @IP_addr1,@IP_addr2,@IP_addr3,@IP_addr4
invoke MessageBox,NULL,addr @szBuffer,addr szMsg,MB_OK
.endif
.elseif uMsg == WM_CLOSE
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_IPA1 1001
#define ID_BUTTON01 41
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义对话框
MyDialog DIALOG 10, 10, 180, 100
STYLE DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "对话框程序模版"
FONT 12, "方正姚体"
BEGIN
CONTROL "IP地址控件示例:", -1, "Static", WS_CHILD | WS_VISIBLE, 20, 25, 100, 20
CONTROL "",IDC_IPA1,"SysIPAddress32",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,85,25,70,10
PUSHBUTTON "取得IP地址", ID_BUTTON01, 40,50,100,15
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>