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号