⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listview.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
📖 第 1 页 / 共 2 页
字号:
   .if  eax!=INVALID_HANDLE_VALUE
      mov hFind,eax
      xor edi,edi
      .while  eax      
         test finddata.dwFileAttributes,FILE_ATTRIBUTE_DIRECTORY
         .if  zero?
            invoke ShowFileInfo,edi,addr finddata
            inc edi
         .else
            invoke ShowPathInfo,edi,addr finddata
            .if  eax!=0ffffffffh;.和..的当前目录不显示出来。
            inc edi
            .endif   
         .endif
         invoke FindNextFile,hFind,addr finddata
      .endw
      invoke FindClose,hFind
   .endif
   ret
FillFileInfo endp


ShowFileInfo proc uses edi row:dword,lpFind:dword
   local lvi:LV_ITEM
   local buffer[20]:BYTE
   local len:DWORD
   local typeFlag:dword
   mov edi,lpFind
   assume edi:ptr WIN32_FIND_DATA
   mov lvi.imask,LVIF_TEXT+LVIF_PARAM+LVIF_IMAGE
   push row
   pop lvi.iItem
   mov lvi.iSubItem,0
   invoke lcase,addr [edi].cFileName
   lea eax,[edi].cFileName
   mov lvi.pszText,eax
   invoke lstrlen,addr TxtExtend
   mov len,eax
   invoke InString,1,addr [edi].cFileName, addr TxtExtend
   .if eax 
   mov lvi.iImage,3  
   mov typeFlag,1
   jmp @F
   .endif   

   invoke lstrlen,addr DocExtend
   mov len,eax
   invoke InString,1,addr [edi].cFileName,addr DocExtend
   .if eax
   mov lvi.iImage,4
   mov typeFlag,2
   jmp @F
   .endif        

   invoke lstrlen,addr ExeExtend
   mov len,eax
   invoke InString,1,addr [edi].cFileName,addr ExeExtend
   .if eax
   mov lvi.iImage,5
   mov typeFlag,3
   jmp @F
   .endif        

   invoke lstrlen,addr BmpExtend
   mov len,eax
   invoke InString,1,addr [edi].cFileName,addr BmpExtend
   .if eax
   mov lvi.iImage,6
   mov typeFlag,4
   jmp @F
   .endif        
   mov lvi.iImage,7
   mov typeFlag,0   
@@:
   push row
   pop lvi.lParam
   invoke SendMessage,hListView,LVM_INSERTITEM,0,addr lvi
   mov lvi.imask,LVIF_TEXT
   inc lvi.iSubItem
   invoke wsprintf,addr buffer,addr char,[edi].nFileSizeLow
   lea eax,buffer
   mov lvi.pszText,eax
   invoke SendMessage,hListView,LVM_SETITEM,0,addr lvi
   .if  typeFlag==1
      mov lvi.pszText,offset txt
   .elseif  typeFlag==2
      mov lvi.pszText,offset doc
   .elseif  typeFlag==3
      mov lvi.pszText,offset exe
   .elseif  typeFlag==4
      mov lvi.pszText,offset bmp
   .else 
      mov lvi.pszText,offset other
   .endif  
   inc lvi.iSubItem
   invoke SendMessage,hListView,LVM_SETITEM,0,addr lvi
   invoke FileTimeToSystemTime,addr [edi].ftCreationTime,addr Date_Time
   mov ax,Date_Time.wYear
   movzx eax,ax
   invoke wsprintf,addr buffer,addr char,eax
   invoke lstrcat,addr CreateDateTime,addr buffer
   invoke lstrcat,addr CreateDateTime,addr interval
   mov ax,Date_Time.wMonth
   movzx eax,ax
   invoke wsprintf,addr buffer,addr char,eax
   invoke lstrcat,addr CreateDateTime,addr buffer
   invoke lstrcat,addr CreateDateTime,addr interval
   mov ax,Date_Time.wDay
   movzx eax,ax
   invoke wsprintf,addr buffer,addr char,eax
   invoke lstrcat,addr CreateDateTime,addr buffer
   invoke lstrcat,addr CreateDateTime,addr interval_space
   mov ax,Date_Time.wHour
   movzx eax,ax
   invoke wsprintf,addr buffer,addr char,eax
   invoke lstrcat,addr CreateDateTime,addr buffer
   invoke lstrcat,addr CreateDateTime,addr interval_colon
   mov ax,Date_Time.wMinute
   movzx eax,ax
   invoke wsprintf,addr buffer,addr char,eax
   invoke lstrcat,addr CreateDateTime,addr buffer
   inc lvi.iSubItem
   mov lvi.pszText,offset CreateDateTime
   invoke SendMessage,hListView,LVM_SETITEM,0,addr lvi
   invoke RtlZeroMemory,addr CreateDateTime,sizeof CreateDateTime
   assume edi:nothing
   ret
ShowFileInfo endp
ShowPathInfo proc uses edi row:dword,lpFind:dword
   local lvi:LV_ITEM
   local buffer[40]:BYTE
   mov edi,lpFind
   assume edi:ptr WIN32_FIND_DATA
   invoke lstrcmpi,addr [edi].cFileName,addr CurrentDirect
   .if !eax
      mov eax,0ffffffffh
      ret
   .endif
   mov lvi.imask,LVIF_TEXT+LVIF_PARAM+LVIF_IMAGE
   invoke lstrcmpi,addr [edi].cFileName,addr ParentDirect
   .if !eax
      mov eax,0ffffffffh
      ret
   .endif
   push row
   pop lvi.iItem
   mov lvi.iSubItem,0
   lea eax,[edi].cFileName
   mov lvi.pszText,eax
   mov lvi.iImage,2
   push row
   pop lvi.lParam
   invoke SendMessage,hListView,LVM_INSERTITEM,0,addr lvi
   mov lvi.imask,LVIF_TEXT
   add lvi.iSubItem, 2
   mov lvi.pszText,offset folder
   invoke SendMessage,hListView,LVM_SETITEM,0,addr lvi
   ret
ShowPathInfo endp

ExecuteFile proc
   local lvi:LV_ITEM
   local buffer[100]:BYTE
   invoke SendMessage,hListView,LVM_GETNEXTITEM,-1,LVNI_FOCUSED
   mov lvi.iItem,eax
   mov lvi.iSubItem,0
   mov lvi.imask,LVIF_TEXT
   lea eax,buffer
   mov lvi.pszText,eax
   mov lvi.cchTextMax,100
   invoke SendMessage,hListView,LVM_GETITEM,0,addr lvi
   invoke InString,1,addr buffer,addr ExeExtend
   .if eax
      invoke WinExec ,addr buffer,SW_SHOW
   .else
      invoke MessageBox,0,addr NoExe,addr TitleName,MB_OK
   .endif
   ret
ExecuteFile endp

CompareFunc proc uses edi lParam1:DWORD,lParam2:DWORD,SortType:DWORD
   local buffer[100]:BYTE
   local buffer1[100]:BYTE
   local lvi:LV_ITEM
   mov lvi.imask,LVIF_TEXT
   lea eax,buffer
   mov lvi.pszText,eax
   mov lvi.cchTextMax,100
   .if  SortType==1
      ;invoke MessageBox,NULL,addr ClassName,addr TitleName,MB_OK;检测两两比较的执行过程。
      mov lvi.iSubItem,1
      invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam1,addr lvi
      invoke atodw ,addr buffer
      mov edi,eax
      invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam2,addr lvi
      invoke atodw,addr buffer
      sub edi,eax
      mov eax,edi
   .elseif  SortType==2
      mov lvi.iSubItem,1
      invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam1,addr lvi
      invoke atodw,addr buffer
      mov edi,eax
      invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam2,addr lvi
      invoke atodw,addr buffer
      sub eax,edi
   .elseif  SortType==3
      mov lvi.iSubItem,0
      invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam1,addr lvi
      invoke lstrcpy,addr buffer1,addr buffer
      invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam2,addr lvi
      invoke lstrcmpi,addr buffer1,addr buffer
   .else
      mov lvi.iSubItem,0
      invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam1,addr lvi
      invoke lstrcpy,addr buffer1,addr buffer
      invoke SendMessage,hListView,LVM_GETITEMTEXT,lParam2,addr lvi
      invoke lstrcmpi,addr buffer,addr buffer1
   .endif
   ret
CompareFunc endp

UpdatelParam proc uses edi
   local lvi:LV_ITEM
   invoke SendMessage,hListView,LVM_GETITEMCOUNT,0,0
   mov edi,eax
   mov lvi.imask,LVIF_PARAM
   mov lvi.iSubItem,0
   mov lvi.iItem,0
   .while edi>0
      push lvi.iItem
      pop lvi.lParam
      invoke SendMessage,hListView,LVM_SETITEM,0,addr lvi
      inc lvi.iItem
      dec edi
   .endw
   ret
UpdatelParam endp
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -