![]() |
#2
onepc2009-09-25 11:32
![]() G:\af\520.txt 会这样的。。。。是否加回车换行那里有问题?G:\af\a.txt G:\af\aa.bat G:\af\dfaa.bat G:\af\y.txt G:\af\复件 (2) a.txt G:\af\复件 (3) a.txt G:\af\复件 (4) a.txt G:\af\复件 (5) a.txt G:\af\复件 (6) a.txt G:\af\复件 (7) a.txt G:\af\复件 (8) a.txt G:\af\复件 a.txt G:\af\新建 Microsoft Excel 工作表.xls G:\af\新建 Microsoft PowerPoint 演示文稿.ppt G:\af\新建 文本文档.txt G:\af\新建文件夹 (2)\复件 (2) a.txt G:\af\新建文件夹 (2)\复件 (3) a.txt G:\af\新建文件夹 (2)\复件 (4) a.txt G:\af\新建文件夹 (2)\复件 (5) a.txt G:\af\新建文件夹 (2)\复件 a.txt |

;练习。。。。。。。。。。。。
;by onepc 153785587
;
.386
.model flat,stdcall
option casemap:none
include windows.inc
;include gdi32.inc
;includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include comdlg32.inc
includelib comdlg32.lib
include macro.asm ;这个是CTXT("") 宏
IDD_DIALOG1 equ 100
IDC_BUTTON1 equ 1000
IDC_EDIT1 equ 1001
IDC_BUTTON2 equ 1002
IDC_STATIC equ 1003
.data
szFilter db 'Text Files(*.txt)',0,'*.txt',0,'All Files(*.*)',0,'*.*',0,0
szBfind db 'find',0
szBstop db 'stop',0
szd db '.',0
szdd db '..',0
;szFexe db '*.exe',0 ;查找exe文件
szFexe db '*.*',0 ;查找exe文件
szEnter db 0dh,0ah,0
szLogfile db 'onepc.log',0 ;记录文件
.data?
hInstance dd ? ;实例句柄其 实就是装入内存的基址
hMin dd ? ;对话框句柄
szPath db MAX_PATH dup(?) ;文件路径缓冲区
szFpath db MAX_PATH dup(?) ;查找路径 g:这种结尾
hFile dd ? ;打开文件句柄
szFpname db MAX_PATH dup(?) ;程序的自身全路径
szFppath db MAX_PATH dup(?) ;程序所在的目录
.code
;打开文件
_openfile proc
local @stFile:OPENFILENAME
invoke RtlZeroMemory,addr @stFile,sizeof @stFile ;填零
mov @stFile.lStructSize,sizeof @stFile
push hMin
pop @stFile.hwndOwner
;mov @stFile.hwndOwner,hMin
mov @stFile.lpstrFilter,offset szFilter
mov @stFile.lpstrFile,offset szPath
mov @stFile.nMaxFile,MAX_PATH
mov @stFile.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST
invoke GetOpenFileName,addr @stFile
.if eax ;getopenfilename打开成功的话返回非0值
invoke MessageBox,NULL,addr szPath,addr szPath,MB_OK
.endif
ret
_openfile endp
;; 程序的路径
_propath proc
push esi ;保存esi
invoke GetModuleFileName,hInstance,addr szFpname,MAX_PATH ;这里得到的程序路径在第二个参数
;invoke MessageBox,NULL,addr szFpname,CTXT("path"),0
mov esi,offset szFpname ;mov 里不能用addr
invoke lstrlen,addr szFpname ;计算长度
add esi,eax ;esi指向szFpname的第一个字符的地址,esi=esi+eax 这时esi指向路径的最后一个字符地址
mov al,'\'
.while TRUE
.break .if byte ptr [esi-1]==al ;esi指向的位置一遇到\就退出循环
dec esi
.endw
xor eax,eax ;把eax置0 ,听说比mov 的速度快 xor 可以看成 not and
mov word ptr [esi],ax ;esi-1 esi 置0 esi-1,及后一个字节为0 这样别的api函数就会戴断。得到所需的
;invoke MessageBox,NULL,addr szFpname,CTXT("path"),0
invoke lstrcpy,addr szFppath,addr szFpname ;把带\的路径传给szFppath
invoke lstrcat,addr szFppath,addr szLogfile ;在程序目录下将要生成的文件onepc.log
;invoke MessageBox,NULL,addr szFppath,CTXT("path"),0
pop esi
ret
_propath endp
;;
;;创建记录文件
_clog proc
call _propath ;得出路径
invoke CreateFile,addr szFppath,GENERIC_WRITE,FILE_SHARE_READ,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
;CREATE_ALWAYS 创建新文件,如果文件已经存在则清除原文件。
.if eax!=INVALID_HANDLE_VALUE ;失败的话返回INVALID_HANDLE_VALUE 成功返回一个文件句柄
mov hFile,eax ;把句柄传给hFile
.endif
ret
_clog endp
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;查找文件
_findfile proc _lppath ;参数 指向路径 \ ;_findfile addr szFpath
local @hFfile
local @stData:WIN32_FIND_DATA
local @szPath[MAX_PATH]:BYTE ;用来存放“路径\”
local @szSearch[MAX_PATH]:BYTE ;用来存放“路径\*.*”
local @szFindFile[MAX_PATH]:BYTE ;用来存放“路径\找到的文件”
local @checkd,@checkdd ;检测变量
local @szWbuffer[MAX_PATH]:BYTE ; 缓冲区 包含 要写入文件的数据
local @dwNum ;保存写入文件中的实际字节数
pushad
invoke lstrcpy,addr @szPath,_lppath ;存放路径\
;;
invoke lstrlen,addr @szPath
lea esi,@szPath
add esi,eax
xor eax,eax
mov al,'\'
.if byte ptr [esi-1] != al
mov word ptr [esi],ax
.endif
invoke lstrcpy,addr @szSearch,addr @szPath
invoke lstrcat,addr @szSearch,addr szFexe ;这时@szSearch存的是路径\*.exe
;;
invoke FindFirstFile,addr @szSearch,addr @stData
.if eax !=INVALID_HANDLE_VALUE ;找到了会返回一个文件句柄,-1表示失败
mov @hFfile,eax
.repeat
;找到处理
invoke lstrcpy,addr @szFindFile,addr @szPath
invoke lstrcat,addr @szFindFile,addr @stData.cFileName ; @stData.cFileName这个是找到的文件名,不带路径
;
;invoke lstrcmp
;参数类型
;int lstrcmp(
; LPCTSTR lpString1, // pointer to first string
; LPCTSTR lpString2 // pointer to second string
; );
;int strcmp( const char *string1, const char *string2 );
;
.if @stData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
;invoke lstrcmp,@stData.cFileName,'.'
;mov @checkd,eax
;cmp @checkd,0
;jz @f
;invoke lstrcmp,@stData.cFileName,'..'
;mov @checkdd,eax
;cmp @checkdd,0
;jz @f
invoke lstrcmp,addr @stData.cFileName,addr szd
mov @checkd,eax
invoke lstrcmp,addr @stData.cFileName,addr szdd
mov @checkdd,eax
.if @checkd && @checkdd
invoke _findfile,addr @szFindFile
.endif
; .if @stData.cFileName != '.'
; invoke _findfile,addr @szFindFile
; .endif
.else
;invoke MessageBox,NULL,addr @szFindFile,CTXT("Find-File"),0
;这里显示文件
;invoke SendDlgItemMessage,hMin,IDC_STATIC,WM_SETTEXT,0,addr @szFindFile
;invoke _savefile,addr @szFindFile ;保存文件名
invoke RtlZeroMemory,addr @szWbuffer,sizeof @szWbuffer ;
invoke lstrcat,addr @szWbuffer,addr @szFindFile
invoke lstrcat,addr @szWbuffer,addr szEnter
invoke WriteFile,hFile,addr @szWbuffer,MAX_PATH,addr @dwNum,0 ;得出的格式不是我想的
.endif
;
invoke FindNextFile,@hFfile,addr @stData
.until eax==FALSE
invoke FindClose,@hFfile ;关闭文件句柄
invoke FindClose,hFile
.endif
popad
ret
_findfile endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DlgProc proc uses esi edi ebx hDlg,uMsg,wParam,lParam
.if uMsg==WM_INITDIALOG
push hDlg
pop hMin
;invoke LoadIcon,hInstance,IDR_MAINFRAME
;invoke SendMessage,hDlg,WM_SETICON,ICON_BIG,eax
invoke SendDlgItemMessage,hDlg,IDC_EDIT1,WM_SETTEXT,0,CTXT("G:\af")
invoke GetDlgItemText,hDlg,IDC_EDIT1,addr szFpath,sizeof szFpath
.elseif uMsg==WM_COMMAND
mov eax,wParam
.if ax==IDC_BUTTON1
call _openfile
call _propath
.endif
.if ax==IDC_BUTTON2
invoke GetDlgItemText,hDlg,IDC_EDIT1,addr szFpath,sizeof szFpath ;取得路径
call _clog
invoke _findfile,addr szFpath
.endif
.elseif uMsg==WM_CLOSE
invoke EndDialog,hDlg,FALSE
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
invoke ExitProcess,NULL
end start

// Generated by ResEdit 1.4.7
// Copyright (C) 2006-2009
// http://www. "resource.h"
#define IDD_DIALOG1 100
#define IDC_BUTTON1 1000
#define IDC_EDIT1 1001
#define IDC_BUTTON2 1002
#define IDC_STATIC 1003
//
// Dialog resources
//
//LANGUAGE 4, SUBLANG_SYS_DEFAULT
IDD_DIALOG1 DIALOG 0, 0, 186, 95
//STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_FIXEDSYS | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
STYLE DS_MODALFRAME | WS_POPUP | DS_CENTER | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "FindFile ASM + API"
FONT 8, "Ms Shell Dlg 2"
{
PUSHBUTTON "Open", IDC_BUTTON1, 41, 36, 36, 14
EDITTEXT IDC_EDIT1, 16, 15, 163, 14, ES_AUTOHSCROLL
DEFPUSHBUTTON "Find", IDC_BUTTON2, 90, 36, 34, 14
LTEXT "", IDC_STATIC, 15, 65, 160, 11, SS_LEFT
}
// Copyright (C) 2006-2009
// http://www. "resource.h"
#define IDD_DIALOG1 100
#define IDC_BUTTON1 1000
#define IDC_EDIT1 1001
#define IDC_BUTTON2 1002
#define IDC_STATIC 1003
//
// Dialog resources
//
//LANGUAGE 4, SUBLANG_SYS_DEFAULT
IDD_DIALOG1 DIALOG 0, 0, 186, 95
//STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_FIXEDSYS | WS_VISIBLE | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP | WS_SYSMENU
STYLE DS_MODALFRAME | WS_POPUP | DS_CENTER | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "FindFile ASM + API"
FONT 8, "Ms Shell Dlg 2"
{
PUSHBUTTON "Open", IDC_BUTTON1, 41, 36, 36, 14
EDITTEXT IDC_EDIT1, 16, 15, 163, 14, ES_AUTOHSCROLL
DEFPUSHBUTTON "Find", IDC_BUTTON2, 90, 36, 34, 14
LTEXT "", IDC_STATIC, 15, 65, 160, 11, SS_LEFT
}