📄 ztssplit.asm
字号:
;*************************************************************
;* 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 + -