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

📄 ztssplit.asm

📁 文件分割器的程序和汇编源玛
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;*************************************************************
;*      Author: 一块三毛钱
;*      E_mail: crazy_soft@163.net
;*    Homepage: http://zhongts.51.net
;*************************************************************
;*     Compile: Hutch's Masm32
;* Create Time: 2002.6.5
;*      Modify: 2002.6.5
;* Description: 文件分割器 V1.10
;*************************************************************

.386
.model flat,stdcall
option casemap:none

;****************************************************************************************

include     ztsSplit.inc
include     c:\masm32\include\windows.inc
include     c:\masm32\include\user32.inc
include     c:\masm32\include\kernel32.inc
include     c:\masm32\include\comdlg32.inc
include     c:\masm32\include\comctl32.inc
include     c:\masm32\include\shell32.inc
include     c:\masm32\include\masm32.inc

includelib  c:\masm32\lib\user32.lib
includelib  c:\masm32\lib\kernel32.lib
includelib  c:\masm32\lib\comdlg32.lib
includelib  c:\masm32\lib\comctl32.lib
includelib  c:\masm32\lib\shell32.lib
includelib  c:\masm32\lib\masm32.lib

;****************************************************************************************

DlgProc        proto :DWORD,:DWORD,:DWORD,:DWORD
SetToolTip     proto :DWORD
GetFolder      proto :DWORD,:DWORD
SizeEditProc   proto :DWORD,:DWORD,:DWORD,:DWORD
FileEditProc   proto :DWORD,:DWORD,:DWORD,:DWORD
FolderEditProc proto :DWORD,:DWORD,:DWORD,:DWORD
Split          proto :DWORD,:DWORD,:DWORD
Merge          proto :DWORD,:DWORD

;****************************************************************************************

.data
AppName          db  "ztsSplit",0
DlgName          db  "DLG_MAIN",0
TooltipClassName db  "Tooltips_class32",0
strSysMenu       db  "窗口处在最上",0
strBtnStart01    db  "分割(&C)",0
strBtnStart02    db  "合并(&M)",0
strMergeExt      db  ".mrg",0
strTitleSplit    db  "选择要分割的文件",0
strTitleMerge    db  "选择要合并的文件",0
strFilterSplit   db  "所有文件(*.*)",0,"*.*",0,0
strFilterMerge   db  "合并信息文件(*.mrg)",0,"*.mrg",0,0
strBrowseTitle   db  "选择文件存放目录:",0
strFolderInfo    db  "分割软件 ztsSplit 所在的目录",0
strIniFileName   db  "desktop.ini",0
strIniFileSection  db ".ShellClassInfo",0
strIniFileKeyValue db "InfoTip=分割软件 ztsSplit 所在的目录",0
                   db "IconIndex=1",0
                   db "IconFile=\",0,0
strError01       db  "打开文件出错",0
strError02       db  "文件创建错误",0
strError03       db  "文件太小,不需要分割",0
strError04       db  "请先指定分割的大小",0
strError05       db  "请先选择需要分割/合并的文件",0
strError06       db  "请选择分割/合并后文件存放的目录",0
strError07       db  "没有合并信息,不能正确合并文件",0
strCopyright     db  "ztsmrg1.1该文件由分割软件 ztsSplit 生成",0
strBatCopy       db  "copy /b ",0
format1          db  "%03d",0

.data?
hInstance      HINSTANCE ?
hToolTip       dd    ?         ;工具提示控件的句柄
hSysMenu       dd    ?         ;系统菜单句柄
hProgress      dd    ?         ;进度条句柄
hEditFile      dd    ?         ;文件名编辑框句柄
hEditFolder    dd    ?         ;目录编辑框句柄
hEditSize      dd    ?         ;分割大小编辑框句柄
hBtnStart      dd    ?         ;分割/合并按钮的句柄
hBtnExit       dd    ?         ;退出按钮的句柄
hBtnFile       dd    ?
hBtnFolder     dd    ?
bSplitOrMerge  BOOL  ?         ;分割还是合并
bKbOrMb        BOOL  ?         ;分割大小的单位是 KB 还是 MB
bSizeEditFocus BOOL  ?         ;“分割大小”编辑框是否拥有焦点
bFileEditFocus BOOL  ?         ;“文件名”编辑框是否拥有焦点
bFolderEditFocus BOOL ?        ;“目录”编辑框是否拥有焦点
strPath        db MAX_PATH dup (?) ;接收拖动来的文件名
strFolder      db MAX_PATH dup (?) ;文件所在的目录
strFileName    db MAX_PATH dup (?) ;可执行文件路径
strModuleDir   db MAX_PATH dup (?) ;可执行文件所在的目录
strIniFilePath db MAX_PATH dup (?)
ofn            OPENFILENAME  <?>
bi             BROWSEINFO    <?>
OldSizeEditProc   dd ?
OldFileEditProc   dd ?
OldFolderEditProc dd ?

;****************************************************************************************

.code
start:
	invoke GetModuleHandle, NULL
	mov    hInstance,eax
	invoke DialogBoxParam,hInstance,addr DlgName,NULL,addr DlgProc,0
	invoke ExitProcess,eax
	invoke InitCommonControls

;对话框窗口过程**************************************************************************

DlgProc  proc  hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
	local  rect:RECT
	local  pt:POINT

	.IF     uMsg==WM_CLOSE

		invoke  GetModuleFileName, hInstance, addr strFileName, MAX_PATH   ;取得文件名
		invoke  GetFolder, addr strModuleDir, addr strFileName             ;计算所属目录
		invoke  SetFileAttributes,addr strModuleDir, FILE_ATTRIBUTE_SYSTEM ;设置目录属性为系统属性

		;计算 desktop.ini 文件的文件名(包括目录)
		invoke  lstrcat, addr strIniFilePath, addr strModuleDir
		invoke  lstrcat, addr strIniFilePath, addr strIniFileName

		;计算 desktop.ini 文件中需要写入的内容
		mov     esi, offset strFileName
		mov     edi, offset strIniFileKeyValue
		labelLoop:
			cmp     BYTE ptr [edi], '\'
			je      labelQuit
			inc     edi
			jmp     labelLoop
		labelQuit:
		invoke  StrLen, addr strFileName
		mov     ecx, eax
		rep     movsd

		;写入 desktop.ini 文件
		invoke  WritePrivateProfileSection, addr strIniFileSection, addr strIniFileKeyValue, addr strIniFilePath
		invoke  SetFileAttributes, addr strIniFilePath, FILE_ATTRIBUTE_HIDDEN ;设置文件属性为隐藏
		invoke  EndDialog, hWnd, NULL

	.ELSEIF uMsg==WM_INITDIALOG

		;设置图标
		invoke  LoadIcon, hInstance, IDI_MAIN
		invoke  SendMessage, hWnd, WM_SETICON, ICON_SMALL, eax

		;添加系统菜单项:“窗口处在最上”
		invoke  GetSystemMenu, hWnd, FALSE          ;取得系统菜单的句柄
		mov     hSysMenu, eax                      ;句柄 => hSysMenu
		invoke  AppendMenu, hSysMenu, MF_SEPARATOR, NULL,NULL                ;插入分隔线
		invoke  AppendMenu, hSysMenu, MF_STRING or MF_UNCHECKED, IDM_SYSMENU, addr strSysMenu ;插入"窗口处在最上"菜单

		;取得几个控件的句柄
		invoke  GetDlgItem, hWnd, IDC_PROGRESS
		mov     hProgress, eax
		invoke  GetDlgItem, hWnd, IDC_EDIT_FILE
		mov     hEditFile, eax
		invoke  GetDlgItem, hWnd, IDC_EDIT_FOLDER
		mov     hEditFolder, eax
		invoke  GetDlgItem, hWnd, IDC_EDIT_SIZE
		mov     hEditSize, eax
		invoke  GetDlgItem, hWnd, IDC_BTN_START
		mov     hBtnStart, eax
		invoke  GetDlgItem, hWnd, IDC_BTN_EXIT
		mov     hBtnExit, eax
		invoke  GetDlgItem, hWnd, IDC_BTN_FILE
		mov     hBtnFile, eax
		invoke  GetDlgItem, hWnd, IDC_BTN_FOLDER
		mov     hBtnFolder, eax

		;初始化为“分割文件”“KB”方式
		invoke  GetDlgItem, hWnd, IDC_RADIO_SPLIT
		invoke  SendMessage, eax, BM_SETCHECK,BST_CHECKED,0
		mov     bSplitOrMerge, TRUE
		invoke  GetDlgItem, hWnd, IDC_RADIO_KB
		invoke  SendMessage, eax, BM_SETCHECK,BST_CHECKED,0
		mov     bKbOrMb, TRUE

		;创建工具提示控件
		invoke  CreateWindowEx, NULL, addr TooltipClassName, NULL, TTS_ALWAYSTIP, \
				CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, \
				NULL, NULL, hInstance, NULL
		mov     hToolTip, eax
		invoke  SetWindowPos, hToolTip, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE

		;设置所有的提示信息
		invoke  SetToolTip, hWnd

		;子类化编辑框控件
		invoke  SetWindowLong, hEditSize, GWL_WNDPROC, addr SizeEditProc
		mov     OldSizeEditProc, eax
		mov     bSizeEditFocus, FALSE
		invoke  SetWindowLong, hEditFile, GWL_WNDPROC, addr FileEditProc
		mov     OldFileEditProc, eax
		mov     bFileEditFocus, FALSE
		invoke  SetWindowLong, hEditFolder, GWL_WNDPROC, addr FolderEditProc
		mov     OldFolderEditProc, eax
		mov     bFolderEditFocus, FALSE

		invoke  SetFocus, hEditFile               ;设置焦点,加了这条语句后下面要用 mov  eax, FLASE / ret ,否则无效

		mov     eax, FALSE
		ret

	.ELSEIF uMsg==WM_COMMAND

		mov     eax, wParam
		and     eax, 0ffffh
		.IF     eax==IDC_RADIO_SPLIT     ;切换到分割状态
			.IF     !bSplitOrMerge
				invoke  GetDlgItem, hWnd, IDC_EDIT_SIZE
				invoke  EnableWindow, eax, TRUE
				invoke  GetDlgItem, hWnd, IDC_RADIO_KB
				invoke  EnableWindow, eax, TRUE
				invoke  GetDlgItem, hWnd, IDC_RADIO_MB
				invoke  EnableWindow, eax, TRUE
				invoke  GetDlgItem, hWnd, IDC_BTN_START
				invoke  SetWindowText, eax, addr strBtnStart01
				mov     bSplitOrMerge, TRUE
			.ENDIF
		.ELSEIF eax==IDC_RADIO_MERGE     ;切换到合并状态
			.IF     bSplitOrMerge
				invoke  GetDlgItem, hWnd, IDC_EDIT_SIZE
				invoke  EnableWindow, eax, FALSE
				invoke  GetDlgItem, hWnd, IDC_RADIO_KB
				invoke  EnableWindow, eax, FALSE
				invoke  GetDlgItem, hWnd, IDC_RADIO_MB
				invoke  EnableWindow, eax, FALSE
				invoke  GetDlgItem, hWnd, IDC_BTN_START
				invoke  SetWindowText, eax, addr strBtnStart02
				mov     bSplitOrMerge, FALSE
			.ENDIF
		.ELSEIF eax==IDC_RADIO_KB        ;分割大小的单位是 KB
			.IF     !bKbOrMb
				mov     bKbOrMb, TRUE
				invoke  SetFocus, hEditSize     ;“分割大小”编辑框得到焦点
			.ENDIF
		.ELSEIF eax==IDC_RADIO_MB        ;分割大小的单位是 MB
			.IF     bKbOrMb
				mov     bKbOrMb, FALSE
				invoke  SetFocus, hEditSize     ;“分割大小”编辑框得到焦点
			.ENDIF
		.ELSEIF eax==IDC_BTN_FILE        ;选择要分割/合并的文件
			mov     ofn.lStructSize, sizeof ofn
			push    hWnd
			pop     ofn.hwndOwner
			push    hInstance
			pop     ofn.hInstance
			mov     ofn.lpstrFile, offset strPath   ;接收文件名
			mov     ofn.nMaxFile, MAX_PATH
			mov     ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_HIDEREADONLY or OFN_EXPLORER or OFN_LONGNAMES
			.IF     bSplitOrMerge    ;分割状态
				mov     ofn.lpstrFilter, offset strFilterSplit ;文件过滤器
				mov     ofn.lpstrTitle, offset strTitleSplit   ;标题文本
			.ELSE                    ;合并状态
				mov     ofn.lpstrFilter, offset strFilterMerge ;文件过滤器
				mov     ofn.lpstrTitle, offset strTitleMerge   ;标题文本
			.ENDIF
			invoke  GetOpenFileName, addr ofn
			.IF     eax
				invoke  SetDlgItemText, hWnd, IDC_EDIT_FILE, addr strPath
				invoke  GetFolder, addr strFolder, addr strPath
				invoke  SetDlgItemText, hWnd, IDC_EDIT_FOLDER, addr strFolder
				.IF     bSplitOrMerge
					invoke  SetFocus, hEditSize  ;“分割大小”编辑框得到焦点
				.ELSE
					invoke  SetFocus, hBtnStart  ;“分割/合并”按钮得到焦点
				.ENDIF
			.ENDIF
		.ELSEIF eax==IDC_BTN_FOLDER      ;选择分割/合并后文件的存放目录
			invoke  RtlZeroMemory, addr bi, sizeof BROWSEINFO ;内存清零
			push    hWnd
			pop     bi.hwndOwner
			mov     eax, offset strFolder             ;接收目录字符串
			mov     bi.pszDisplayName, eax
			mov     eax, offset strBrowseTitle        ;目录选择框上面的文本
			mov     bi.lpszTitle, eax
			mov     bi.ulFlags, BIF_RETURNONLYFSDIRS  ;选择目录
			invoke  SHBrowseForFolder, addr bi
			.IF     eax
				invoke  SHGetPathFromIDList, eax, addr strFolder ;转换 PIDL 为目录名
				invoke  StrLen, addr strFolder       ;取得字符串长度
				mov     esi, offset strFolder        ;esi 指向开始的位置
				add     esi, eax                     ;esi 指向结束的位置
				cmp     BYTE ptr [esi-1], '\'        ;判断是不是以'\'结尾
				je      labelExit
					mov     BYTE ptr [esi], '\'  ;如果不是则添加一个'\'
					mov     BYTE ptr [esi+1], 0
				labelExit:
				invoke  SetDlgItemText, hWnd, IDC_EDIT_FOLDER, addr strFolder
				invoke  SetForegroundWindow, hWnd    ;激活窗口
				.IF     bSplitOrMerge
					invoke  SetFocus, hEditSize  ;“分割大小”编辑框得到焦点
				.ELSE
					invoke  SetFocus, hBtnStart  ;“分割/合并”按钮得到焦点
				.ENDIF
			.ENDIF
		.ELSEIF eax==IDC_BTN_START
			.IF     bSplitOrMerge
				invoke  GetDlgItemInt, hWnd, IDC_EDIT_SIZE, NULL, FALSE
				.IF     bKbOrMb
					shl     eax, 10
				.ELSE
					shl     eax, 20
				.ENDIF

⌨️ 快捷键说明

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