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

📄 ztssplit v1.11.asm

📁 一个文件分割器软件
💻 ASM
📖 第 1 页 / 共 3 页
字号:
                        .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[256]:BYTE          ;被分割的文件名(包括扩展名)
        local  filetitle[256]:BYTE               ;文件名(不包括扩展名)
        local  fileExt[10]:BYTE                  ;扩展名
        local  filename[MAX_PATH]:BYTE           ;文件名(包括路径和扩展名)
        local  ActualReaded:DWORD                ;实际读出来的字节
        local  BufCount:DWORD                    ;记录每个分割文件已经写入的字节
        local  number:DWORD                      ;分割文件的个数


        pushad
        ;没指定需要分割的文件
        mov     esi, lpfile
        mov     al, byte ptr [esi]
        .IF     al == 0
                invoke  MessageBox, hMainWnd, addr strError05, addr AppName, MB_OK or MB_ICONERROR
                popad
                ret
        .ENDIF

        ;没指定分割后文件存放的目录
        mov     esi, lpfolder
        mov     al, byte ptr [esi]
        .IF     al == 0
                invoke  MessageBox, hMainWnd, addr strError06, addr AppName, MB_OK or MB_ICONERROR
                popad
                ret
        .ENDIF

        ;没指定分割大小
        .IF     blocksize==0
                invoke  MessageBox, hMainWnd, addr strError04, addr AppName, MB_OK or MB_ICONERROR
                popad
                ret
        .ENDIF

        ;打开文件失败
        invoke  CreateFile, lpfile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL
        .IF     eax==INVALID_HANDLE_VALUE
                invoke  MessageBox, hMainWnd, addr strError01, addr AppName, MB_OK or MB_ICONERROR

⌨️ 快捷键说明

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