本文主要是介绍win32汇编Demo_电话本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
使用win32汇编实现一个电话本Demo
PhoneBook.inc
include windows.inc
include kernel32.inc
include user32.inc
include Comctl32.inc
include shell32.incincludelib kernel32.lib
includelib user32.lib
includelib Comctl32.lib
includelib shell32.libDlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM;图标
ICO_MAIN equ 101
;输入姓名
IDC_EDT_NAME equ 1001
;姓名标签
IDC_STC1 equ 1002
;添加号码
IDC_BTN_ADDNUM equ 1003
;删除号码
IDC_BTN_DELNUM equ 1004
;修改号码
IDC_BTN_UPNUM equ 1005
;查询号码
IDC_BTN_SELNUM equ 1006
;输入号码
IDC_EDT_NUMBER equ 1008
;显示所有联系人
IDC_EDT_DISPLAY equ 1009
;联系人组别
IDC_EDT_SEC equ 1012IDD_DIALOG1 equ 101;#######################################################################
.const;ini文件名字
szFileName db '\telNum.ini',0
szSecPos db 'Windows Position',0
szFmtSelect db '%s的电话:%s',0
szKeyX db 'X',0
szKeyY db 'Y',0
szFmt1 db '%d',0
szFmtSection db '[%s]';换行
szCrLf db 0dh,0ah,0
lpText db '添加成功!',0
lpCaption db '提示',0lpText1 db '没有该联系人!',0lpText2 db '请输入电话号码!',0lpText3 db '修改成功!',0lpText4 db '删除成功!',0lpText5 db '未找到联系人!',0lpText6 db '组别,姓名,电话不能为空!',0lpText7 db '组别,姓名不能为空!',0
;#########################################################################.data?hInstance dd ?
hWinMain dd ?
hIcon dd ?
szProfileName dd MAX_PATH dup(?)szBuffer1 dd 32760 dup(?)
szBuffer2 dd 32760 dup(?);#########################################################################
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitiveinclude PhoneBook.inc.code; 循环遍历全部的组别和对应组别中的姓名,将其保存在缓冲区中
_EnumINI proc local @szBuffer[256]:byte;读取 组别 列表并循环处理invoke SetDlgItemText,hWinMain,IDC_EDT_DISPLAY,NULL;返回组别的名称存入szBuffer1中invoke GetPrivateProfileSectionNames,addr szBuffer1,\sizeof szBuffer1,addr szProfileNamemov esi,offset szBuffer1.while byte ptr [esi]invoke wsprintf,addr @szBuffer,addr szFmtSection,esiinvoke SendDlgItemMessage,hWinMain,IDC_EDT_DISPLAY,EM_REPLACESEL,FALSE,addr @szBuffer; 读取 联系人 列表并循环显示;根据组别名称,返回联系人invoke GetPrivateProfileSection,esi,addr szBuffer2,\sizeof szBuffer2,addr szProfileNamemov edi,offset szBuffer2.while byte ptr [edi]invoke SendDlgItemMessage,hWinMain,IDC_EDT_DISPLAY,EM_REPLACESEL,FALSE,ediinvoke SendDlgItemMessage,hWinMain,IDC_EDT_DISPLAY,EM_REPLACESEL,FALSE,addr szCrLfinvoke lstrlen,ediadd edi,eaxinc edi.endwinvoke lstrlen,esiadd esi,eaxinc esi.endwret_EnumINI endp;将当前路径和 ini 文件名组合起来
_GetPosition proclocal @szBuffer[512]:byteinvoke GetCurrentDirectory,MAX_PATH,addr szProfileNamemov esi,offset szProfileNameinvoke lstrlen,esimov ecx,offset szFileName.if byte ptr [esi+eax-1] == '\'inc ecx.endifinvoke lstrcat,esi,ecxret_GetPosition endpstart:invoke GetModuleHandle,NULLmov hInstance,eaxinvoke InitCommonControlsinvoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULLinvoke ExitProcess,0;########################################################################DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAMlocal @szSection[256]:byte ;组别local @szKey[256]:byte ;姓名local @szValue[256]:byte ;电话local @szBuffer[256]:byte ;字符缓冲区mov eax,uMsg.if eax==WM_INITDIALOGinvoke _GetPositioninvoke _EnumINI.elseif eax==WM_COMMAND;获取对话框中的值invoke GetDlgItemText,hWin,IDC_EDT_SEC,addr @szSection,sizeof @szSectioninvoke GetDlgItemText,hWin,IDC_EDT_NAME,addr @szKey,sizeof @szKeyinvoke GetDlgItemText,hWin,IDC_EDT_NUMBER,addr @szValue,sizeof @szValuemov eax,wParam;##########修改号码########## .if ax == IDC_BTN_UPNUM ;首先查询号码是否存在invoke GetPrivateProfileString,addr @szSection,\addr @szKey,NULL,addr @szBuffer,\sizeof @szBuffer,addr szProfileName.if eax == 0;返回0表示没有该联系人invoke MessageBox,hWin,addr lpText1,addr lpCaption, MB_OK.else;非0则存在联系人,判断添加号码是否为空.if @szValue != NULLinvoke WritePrivateProfileString,addr @szSection,\addr @szKey,addr @szValue,addr szProfileNameinvoke MessageBox,hWin,addr lpText3,addr lpCaption, MB_OK.elseinvoke MessageBox,hWin,addr lpText2,addr lpCaption, MB_OK.endif.endif;##########删除号码##########.elseif ax == IDC_BTN_DELNUM .if @szSection == NULL || @szKey == NULLinvoke MessageBox,hWin,addr lpText7,addr lpCaption, MB_OK.elseinvoke WritePrivateProfileString,addr @szSection,\addr @szKey,NULL,addr szProfileNameinvoke MessageBox,hWin,addr lpText4,addr lpCaption, MB_OK.endif ;##########添加号码########## .elseif ax == IDC_BTN_ADDNUM .if @szSection == NULL || @szKey == NULL || @szValue == NULLinvoke MessageBox,hWin,addr lpText6,addr lpCaption, MB_OK.elseinvoke WritePrivateProfileString,addr @szSection,\addr @szKey,addr @szValue,addr szProfileNameinvoke MessageBox,hWin,addr lpText,addr lpCaption, MB_OK.endif;##########查询号码########## .elseif ax == IDC_BTN_SELNUM invoke GetPrivateProfileString,addr @szSection,\addr @szKey,NULL,addr @szValue,\sizeof @szValue,addr szProfileName.if eax != 0invoke wsprintf,addr @szBuffer,addr szFmtSelect,addr @szKey,addr @szValueinvoke SetDlgItemText,hWin,IDC_EDT_DISPLAY,addr @szBuffer.elseinvoke MessageBox,hWin,addr lpText5,addr lpCaption, MB_OK.endif.endifinvoke _EnumINI.elseif eax==WM_CLOSEinvoke EndDialog,hWin,0.elsemov eax,FALSEret.endifmov eax,TRUEretDlgProc endpend start
运行效果如图所示:
这篇关于win32汇编Demo_电话本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!