WIN32汇编语言教程:第10章 内存管理和文件操作 · 10.2 文件操作(8)
;******************************************************************** mov edx,dwFileSizeHigh mov eax,dwFileSizeLow mov ecx,1000 div ecx invoke wsprintf,addr @szBuffer,addr szSearchInfo,\ dwFolderCount,dwFileCount,eax invoke SetDlgItemText,hWinMain,IDC_NOWFILE,addr @szBuffer ;******************************************************************** ; 设置标志,并启用“浏览”按钮和路径输入栏 ;******************************************************************** invoke GetDlgItem,hWinMain,IDC_BROWSE invoke EnableWindow,eax,TRUE invoke GetDlgItem,hWinMain,IDC_PATH invoke EnableWindow,eax,TRUE invoke SetDlgItemText,hWinMain,IDOK,addr szStart invoke SetDlgItemText,hWinMain,IDC_PATH,addr szPath and dwOption,not F_SEARCHING ret _ProcThread endp ;#################################################################### _ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam local @dwTemp,@szBuffer[MAX_PATH]:byte mov eax,wMsg .if eax == WM_CLOSE .if ! (dwOption & F_SEARCHING) invoke EndDialog,hWnd,NULL .endif ;******************************************************************** .elseif eax == WM_INITDIALOG push hWnd pop hWinMain invoke LoadIcon,hInstance,ICO_MAIN invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax invoke SendDlgItemMessage,hWnd,IDC_PATH,\ EM_SETLIMITTEXT,MAX_PATH,0 ;******************************************************************** .elseif eax == WM_COMMAND mov eax,wParam .if ax == IDC_BROWSE invoke _BrowseFolder,hWnd,addr szPath .if eax invoke SetDlgItemText,hWnd,IDC_PATH,addr szPath .endif .elseif ax == IDC_PATH invoke GetDlgItemText,hWnd,IDC_PATH,addr @szBuffer,MAX_PATH mov ebx,eax invoke GetDlgItem,hWnd,IDOK Invoke EnableWindow,eax,ebx ;******************************************************************** ; 按下开始按钮,如果在寻找中则设置停止标志 ; 如果没有开始寻找则建立一个寻找文件的线程 ;******************************************************************** .elseif ax == IDOK .if dwOption & F_SEARCHING or dwOption,F_STOP .else invoke GetDlgItemText,hWnd,IDC_PATH,addr szPath,MAX_PATH invoke CreateThread,NULL,0,offset _ProcThread,NULL,\ NULL,addr @dwTemp invoke CloseHandle,eax .endif .endif ;******************************************************************** .else mov eax,FALSE ret .endif mov eax,TRUE ret _ProcDlgMain endp ;#################################################################### start: invoke GetModuleHandle,NULL mov hInstance,eax invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,\ offset _ProcDlgMain,NULL invoke ExitProcess,NULL ;#################################################################### end start
例子文件的资源文件FindFile.rc如下:
#include <resource.h> //################################################################## #define ICO_MAIN 1000 #define DLG_MAIN 100 #define IDC_PATH 101 #define IDC_BROWSE 102 #define IDC_NOWFILE 103 //################################################################## ICO_MAIN ICON "Main.ico" //################################################################## DLG_MAIN DIALOG 141, 208, 344, 38 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "全盘文件搜索" FONT 9, "宋体" { EDITTEXT IDC_PATH, 43, 5, 211, 12, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP PUSHBUTTON "浏览(&B)", IDC_BROWSE, 259, 4, 40, 14 PUSHBUTTON "开始(&S)", IDOK, 299, 4, 40, 14, WS_DISABLED | WS_TABSTOP LTEXT "起始目录", -1, 7, 8, 35, 8 LTEXT "", IDC_NOWFILE, 7, 24, 330, 8 } //##################################################################
例子程序查找指定目录以及所有下层子目录中的所有文件,然后累计文件的长度,以此计算目录中所有文件的总长度,当单击对话框中的“浏览”按钮的时候,程序调用第08章中介绍的“浏览目录”通用对话框获取需要查找的目录,源程序中用到了第08章中介绍的_BrowseFolder子程序。
在这个例子中,用到了多线程编程的方法,因为通盘查找文件需要的时间比较多,不适合在处理单条消息的过程中完成,有关多线程的内容读者可以参考第12章。总之,当用户按下了“开始”按钮后,程序在WM_COMMAND消息中对IDOK按钮进行处理,处理的方法是调用CreateThread函数建立一个新的线程来执行_ProcThread子程序,在这个子程序中来进行查找工作,子程序的开始和结束部分对对话框中的按钮进行灰化和重新激活,在中间则调用_FindFile子程序来进行真正的查找工作。
上页:第10章 内存管理和文件操作 · 10.2 文件操作(7) 下页:第10章 内存管理和文件操作 · 10.2 文件操作(9)
第10章 内存管理和文件操作
版权所有 © 云南伯恩科技 证书:粤ICP备09170368号