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

📄 ztssplit v1.11.asm

📁 一个文件分割器软件
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;*************************************************************
;*      Author: 一块三毛钱
;*      E_mail: crazy_soft@163.net
;*    Homepage: http://zhongts.yeah.net
;*************************************************************
;*     Compile: Hutch's Masm32
;* Create Time: 2002.6.5
;*      Modify: 2003.10.17
;* Description: 文件分割器 V1.11
;*************************************************************

.386
.model flat,stdcall
option casemap:none

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

include     ztsSplit V1.11.inc

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

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
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
format1          db  "%03d",0

.data?
hInstance      HINSTANCE ?
hMainWnd       dd    ?
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  EndDialog, hWnd, NULL

        .ELSEIF uMsg==WM_INITDIALOG

                push    hWnd
                pop     hMainWnd

                ;设置图标
                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_CHECKED, IDM_SYSMENU, addr strSysMenu ;插入"窗口处在最上"菜单
                invoke  SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE

                ;取得几个控件的句柄
                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
                	invoke  EnableWindow,hBtnStart,FALSE
                        .IF     bSplitOrMerge
                                invoke  GetDlgItemInt, hWnd, IDC_EDIT_SIZE, NULL, FALSE
                                .IF     bKbOrMb
                                        shl     eax, 10
                                .ELSE
                                        shl     eax, 20
                                .ENDIF
                                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
                	invoke  EnableWindow,hBtnStart,TRUE
                .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    ;激活窗口

⌨️ 快捷键说明

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