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

📄 ztssplit.asm

📁 文件分割器的程序和汇编源玛
💻 ASM
📖 第 1 页 / 共 3 页
字号:
				invoke  Split, addr strPath, addr strFolder, eax
				invoke  SendMessage, hProgress, PBM_SETPOS, 0, 0
			.ELSE
				invoke  Merge, addr strPath, addr strFolder
				invoke  SendMessage, hProgress, PBM_SETPOS, 0, 0
			.ENDIF
		.ELSEIF eax==IDC_BTN_EXIT
			invoke  SendMessage, hWnd, WM_CLOSE, 0, 0
		.ENDIF
	
	.ELSEIF uMsg==WM_SYSCOMMAND

		mov     eax,wParam
		movzx   eax,ax
		.IF     eax==IDM_SYSMENU
			invoke  GetMenuState, hSysMenu, IDM_SYSMENU, MF_BYCOMMAND
			.IF     (eax & MF_CHECKED)   ;判断菜单是否是选中的
				invoke  CheckMenuItem, hSysMenu, IDM_SYSMENU, MF_UNCHECKED
				invoke  SetWindowPos, hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE
			.ELSE
				invoke  CheckMenuItem, hSysMenu, IDM_SYSMENU, MF_CHECKED
				invoke  SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE
			.ENDIF
		.ELSE
			invoke  DefWindowProc,hWnd,uMsg,wParam,lParam
		.ENDIF

	.ELSEIF uMsg==WM_DROPFILES
		invoke  DragQueryFile, wParam, 0, addr strPath, MAX_PATH  ;得到文件路径
		invoke  GetFileAttributes, addr strPath      ;取得文件属性,判断是否文件夹
		and     eax, FILE_ATTRIBUTE_DIRECTORY
		.IF     eax     ;如果是文件夹
			invoke  SetDlgItemText, hWnd, IDC_EDIT_FOLDER, addr strPath
			invoke  SetForegroundWindow, hWnd    ;激活窗口
			.IF     bSplitOrMerge
				invoke  SetFocus, hEditSize  ;“分割大小”编辑框得到焦点
			.ELSE
				invoke  SetFocus, hBtnStart  ;“分割/合并”按钮得到焦点
			.ENDIF
		.ELSE
			.IF     bSplitOrMerge    ;当前为分割状态
				invoke  SetDlgItemText, hWnd, IDC_EDIT_FILE, addr strPath
				invoke  GetFolder, addr strFolder, addr strPath
				invoke  SetDlgItemText, hWnd, IDC_EDIT_FOLDER, addr strFolder
				invoke  SetForegroundWindow, hWnd      ;激活窗口
				invoke  SetFocus, hEditSize    ;“分割大小”编辑框得到焦点
			.ELSE   ;当前为合并状态
				mov     esi, offset strPath
				invoke  StrLen, addr strPath
				add     esi, eax
				sub     esi, 4
				invoke  lstrcmp, esi, addr strMergeExt ;判断最后 4 个字符是否为 ".mrg"
				.IF     eax==0
					invoke  SetDlgItemText, hWnd, IDC_EDIT_FILE, addr strPath
					invoke  GetFolder, addr strFolder, addr strPath
					invoke  SetDlgItemText, hWnd, IDC_EDIT_FOLDER, addr strFolder
					invoke  SetForegroundWindow, hWnd ;激活窗口
					invoke  SetFocus, hBtnStart ;“分割/合并”按钮得到焦点
				.ENDIF
			.ENDIF
		.ENDIF
		invoke  DragFinish,wParam  ;释放内存

	.ELSE
		mov  eax,FALSE		
		ret
	.ENDIF
	mov  eax,TRUE
	ret
DlgProc endp

;==========================================
; 设置所有提示信息
;==========================================
SetToolTip  proc  hWnd:DWORD
	local  ti:TOOLINFO

	mov     ti.cbSize, sizeof TOOLINFO
	mov     ti.uFlags, TTF_SUBCLASS or TTF_IDISHWND
	push    hWnd
	pop     ti.hWnd

	;先设置主界面提示信息
	push    hWnd
	pop     ti.uId
	mov     ti.lpszText, offset strMainTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;------------------------------------------------
	; 设置其他控件的提示信息
	;------------------------------------------------

	;“分割文件”单选框提示信息
	invoke  GetDlgItem, hWnd, IDC_RADIO_SPLIT
	mov     ti.uId, eax
	mov     ti.lpszText, offset strSplitTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;“合并文件”单选框提示信息
	invoke  GetDlgItem, hWnd, IDC_RADIO_MERGE
	mov     ti.uId, eax
	mov     ti.lpszText, offset strMergeTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;“文件名”编辑框提示信息
	invoke  GetDlgItem, hWnd, IDC_EDIT_FILE
	mov     ti.uId, eax
	mov     ti.lpszText, offset strFileTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;“目录”编辑框提示信息
	invoke  GetDlgItem, hWnd, IDC_EDIT_FOLDER
	mov     ti.uId, eax
	mov     ti.lpszText, offset strFolderTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;“选择文件”按钮提示信息
	invoke  GetDlgItem, hWnd, IDC_BTN_FILE
	mov     ti.uId, eax
	mov     ti.lpszText, offset strBtnFileTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;“选择文件夹”按钮提示信息
	invoke  GetDlgItem, hWnd, IDC_BTN_FOLDER
	mov     ti.uId, eax
	mov     ti.lpszText, offset strBtnFolderTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;“分割大小”编辑框提示信息
	invoke  GetDlgItem, hWnd, IDC_EDIT_SIZE
	mov     ti.uId, eax
	mov     ti.lpszText, offset strSizeTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;“KB”单选框提示信息
	invoke  GetDlgItem, hWnd, IDC_RADIO_KB
	mov     ti.uId, eax
	mov     ti.lpszText, offset strKbTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;“MB”单选框提示信息
	invoke  GetDlgItem, hWnd, IDC_RADIO_MB
	mov     ti.uId, eax
	mov     ti.lpszText, offset strMbTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;进度条提示信息
	invoke  GetDlgItem, hWnd, IDC_PROGRESS
	mov     ti.uId, eax
	mov     ti.lpszText, offset strProgressTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;“分割/合并”按钮提示信息
	invoke  GetDlgItem, hWnd, IDC_BTN_START
	mov     ti.uId, eax
	mov     ti.lpszText, offset strStartTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	;“退出”按钮提示信息
	invoke  GetDlgItem, hWnd, IDC_BTN_EXIT
	mov     ti.uId, eax
	mov     ti.lpszText, offset strExitTip
	invoke  SendMessage, hToolTip, TTM_ADDTOOL, NULL, addr ti

	ret
SetToolTip  endp

;==========================================
; 根据文件名得到文件夹
;==========================================
GetFolder  proc  lpFolder:HWND, lpFile:DWORD

	;把 lpFile 地址处的字符串传送到 lpFolder 地址处
	mov     esi, lpFile
	mov     edi, lpFolder
	invoke  StrLen, lpFile
	mov     ecx, eax
	rep     movsd

	mov     esi, lpFolder        ; esi 指向 lpFolder,也就是字符串开始的位置
	add     esi, eax             ; esi 加上 eax(字符串长度)后指向字符串结束的位置
	dec     esi                  ; esi 指向字符串末尾的一个字符

;从字符串末尾向前测试每一个字符,如果为 '\' 则说明再往前就是文件夹
labelTest:
	cmp     BYTE ptr [esi], '\'
	je      labelExit
	dec     esi
	jmp     labelTest
labelExit:
	inc     esi
	mov     BYTE ptr [esi], 0

	ret
GetFolder  endp

;==========================================
; “分割大小”编辑框窗口过程
;     当窗口获得焦点时选中所有文本
;==========================================
SizeEditProc  proc  hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

	.IF uMsg==WM_SETFOCUS
		mov     bSizeEditFocus, TRUE                 ;拥有焦点
		invoke  SendMessage, hWnd, EM_SETSEL, 0, -1  ;选中全部文本
		invoke  CallWindowProc, OldSizeEditProc, hWnd, uMsg, wParam, lParam
		ret
	.ELSEIF uMsg==WM_LBUTTONDOWN
		.IF     !bSizeEditFocus          ;如果没有焦点
			invoke  SetFocus, hWnd   ;则设置焦点
		.ELSE                            ;如果已经有焦点,则按缺省处理
			invoke  CallWindowProc, OldSizeEditProc, hWnd, uMsg, wParam, lParam
			ret
		.ENDIF
	.ELSEIF uMsg==WM_KILLFOCUS
		mov     bSizeEditFocus, FALSE    ;失去焦点
		invoke  CallWindowProc, OldSizeEditProc, hWnd, uMsg, wParam, lParam
		ret
	.ELSE
		invoke  CallWindowProc, OldSizeEditProc, hWnd, uMsg, wParam, lParam
		ret
	.ENDIF

	xor   eax, eax
	ret
SizeEditProc  endp

;==================================================
; “文件名”编辑框窗口过程
;     当窗口获得焦点时光标滚到最后,方便修改
;     当窗口失去焦点时光标滚到最前,方便观看
;==================================================
FileEditProc  proc  hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

	.IF uMsg==WM_SETFOCUS
		mov     bFileEditFocus, TRUE                      ;拥有焦点
		invoke  SendMessage, hWnd, WM_GETTEXTLENGTH, 0, 0 ;取得文本长度
		invoke  SendMessage, hWnd, EM_SETSEL, eax, eax    ;光标滚到最后
		invoke  CallWindowProc, OldFileEditProc, hWnd, uMsg, wParam, lParam
		ret
	.ELSEIF uMsg==WM_LBUTTONDOWN
		.IF     !bFileEditFocus          ;如果没有焦点
			invoke  SetFocus, hWnd   ;则设置焦点
		.ELSE                            ;如果已经有焦点,则按缺省处理
			invoke  CallWindowProc, OldFileEditProc, hWnd, uMsg, wParam, lParam
			ret
		.ENDIF
	.ELSEIF uMsg==WM_KILLFOCUS
		mov     bFileEditFocus, FALSE                     ;失去焦点
		invoke  SendMessage, hWnd, EM_SETSEL, 0, 0        ;光标滚到最前
		invoke  CallWindowProc, OldFileEditProc, hWnd, uMsg, wParam, lParam
		ret
	.ELSE
		invoke  CallWindowProc, OldFileEditProc, hWnd, uMsg, wParam, lParam
		ret
	.ENDIF

	xor   eax, eax
	ret
FileEditProc  endp

;==================================================
; “目录”编辑框窗口过程
;     当窗口获得焦点时光标滚到最后,方便修改
;     当窗口失去焦点时光标滚到最前,方便观看
;==================================================
FolderEditProc  proc  hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

	.IF uMsg==WM_SETFOCUS
		mov     bFolderEditFocus, TRUE                    ;拥有焦点
		invoke  SendMessage, hWnd, WM_GETTEXTLENGTH, 0, 0 ;取得文本长度
		invoke  SendMessage, hWnd, EM_SETSEL, eax, eax    ;光标滚到最后
		invoke  CallWindowProc, OldFolderEditProc, hWnd, uMsg, wParam, lParam
		ret
	.ELSEIF uMsg==WM_LBUTTONDOWN
		.IF     !bFolderEditFocus        ;如果没有焦点
			invoke  SetFocus, hWnd   ;则设置焦点
		.ELSE                            ;如果已经有焦点,则按缺省处理
			invoke  CallWindowProc, OldFolderEditProc, hWnd, uMsg, wParam, lParam
			ret
		.ENDIF
	.ELSEIF uMsg==WM_KILLFOCUS
		mov     bFolderEditFocus, FALSE                   ;失去焦点
		invoke  SendMessage, hWnd, EM_SETSEL, 0, 0        ;光标滚到最前
		invoke  CallWindowProc, OldFolderEditProc, hWnd, uMsg, wParam, lParam
		ret
	.ELSE
		invoke  CallWindowProc, OldFolderEditProc, hWnd, uMsg, wParam, lParam
		ret
	.ENDIF

	xor   eax, eax
	ret
FolderEditProc  endp

;=========================================
; 分割过程
; 参数:待分割文件,存放目录,分割大小
;=========================================
Split  proc  lpfile:DWORD, lpfolder:DWORD, blocksize:DWORD
	local  hSourceFile, hDestFile:DWORD
	local  hMrgFile:DWORD
	local  buffer[1024]:BYTE                 ;缓冲区
	local  sourcefilename[128]:BYTE          ;被分割的文件名(包括扩展名)
	local  filetitle[128]:BYTE               ;文件名(不包括扩展名)
	local  fileExt[10]:BYTE                  ;扩展名
	local  filename[128]:BYTE                ;文件名(包括路径和扩展名)
	local  ActualReaded:DWORD                ;实际读出来的字节
	local  BufCount:DWORD                    ;记录每个分割文件已经写入的字节
	local  number:DWORD                      ;分割文件的个数

	;没指定需要分割的文件
	mov     esi, lpfile

⌨️ 快捷键说明

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