📄 downloadurl.asm
字号:
DEBUG equ 0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Programmed by 罗云彬, bigluo@telekbird.com.cn
; Website: http://asm.yeah.net
; LuoYunBin's Win32 ASM page (罗云彬的编程乐园)
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Http/Ftp 下载示范程序
; Ver1.0 2000.03.01
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat, stdcall
option casemap :none ; case sensitive
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc
include comdlg32.inc
includelib comctl32.lib
includelib comdlg32.lib
includelib user32.lib
includelib kernel32.lib
include wininet.inc
includelib wininet.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; equ 数据
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN equ 1000
DLG_MAIN equ 2000
IDC_URL equ 2001
IDC_INFO equ 2002
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstance dd ?
hWinMain dd ?
hThread dd ?
szBuffer db 512 dup (?)
szUrl db 512 dup (?)
dwFlag dd ?
F_ABORT equ 0001h
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szHttp db 'http://',0
szStateOK db '200',0
szAgentName db "Lyb's Download Sample",0
szConnecting db '正在联接主机',0
szConnError db '无法联接到主机',0
szNoFile db '指定文件不存在',0
szReadError db '接收数据错误',0
szWriteError db '无法建立保存文件',0
szFinish db '文件接收完毕',0
szAbort db '下载被终止',0
szAllFile db 'All Files(*.*)',0,'*.*',0,0
szFormat db '已经下载 %d 字节(%d%%)',0
szNull db 0
szStart db '开始下载(&D)',0
szStop db '终止下载(&S)',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
if DEBUG
include Debug.asm
endif
include Win.asm ;通用窗口子程序库
include Char.asm
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 查询存盘文件名
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_GetSaveFile proc lpBuffer,dwBufferSize
local @stOpenFileName:OPENFILENAME
invoke RtlZeroMemory,addr @stOpenFileName,sizeof OPENFILENAME
invoke RtlZeroMemory,lpBuffer,dwBufferSize
mov @stOpenFileName.lStructSize,SIZEOF @stOpenFileName
mov @stOpenFileName.Flags,OFN_OVERWRITEPROMPT or OFN_CREATEPROMPT
push hWinMain
pop @stOpenFileName.hwndOwner
mov @stOpenFileName.lpstrFilter,offset szAllFile
push lpBuffer
pop @stOpenFileName.lpstrFile
mov @stOpenFileName.nMaxFile,MAX_PATH
invoke GetSaveFileName,addr @stOpenFileName
ret
_GetSaveFile endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ShowInfo proc lpText
invoke SetDlgItemText,hWinMain,IDC_INFO,lpText
ret
_ShowInfo endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 下载文件功能
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_DownLoad proc uses ebx ecx edx esi edi,lParam
local @hSession,@hHttpFile,@dwRead
local @dwTotalByte,@dwNowReadByte
local @hSaveFile,@dwWrite
local @szBuffer[MAX_PATH]:byte
pushad
and dwFlag,not F_ABORT
invoke GetDlgItem,hWinMain,IDOK
invoke EnableWindow,eax,FALSE
invoke GetDlgItem,hWinMain,IDC_URL
invoke EnableWindow,eax,FALSE
invoke _ShowInfo,addr szNull
;********************************************************************
; 处理输入的地址
;********************************************************************
invoke lstrcpy,addr szBuffer,addr szUrl
mov szBuffer+7,0
invoke lstrcmpi,addr szBuffer,addr szHttp
.if eax
invoke lstrcpy,addr szBuffer,addr szUrl
invoke lstrcpy,addr szUrl,addr szHttp
invoke lstrcat,addr szUrl,addr szBuffer
invoke SetDlgItemText,hWinMain,IDC_URL,addr szUrl
.endif
;********************************************************************
; 建立 Internet 联接
;********************************************************************
invoke InternetOpen,addr szAgentName,INTERNET_OPEN_TYPE_PRECONFIG,\
NULL,NULL,0
.if ! eax
mov ebx,offset szConnError
jmp _DL_Ret
.endif
mov @hSession,eax
;********************************************************************
; 打开 URL
;********************************************************************
invoke _ShowInfo,addr szConnecting
invoke InternetOpenUrl,@hSession,addr szUrl,NULL,0,INTERNET_FLAG_NO_AUTO_REDIRECT,0
.if ! eax
mov ebx,offset szConnError
jmp _DL_Err
.endif
mov @hHttpFile,eax
;********************************************************************
; 检测文件长度以及文件是否存在
;********************************************************************
mov @dwRead,sizeof szBuffer
invoke HttpQueryInfo,@hHttpFile,HTTP_QUERY_STATUS_CODE,\
addr szBuffer,addr @dwRead,NULL
.if ! eax
mov ebx,offset szReadError
jmp _DL_Err1
.endif
invoke lstrcmp,addr szBuffer,addr szStateOK
.if eax
mov ebx,offset szNoFile
jmp _DL_Err1
.endif
invoke HttpQueryInfo,@hHttpFile,HTTP_QUERY_CONTENT_LENGTH,\
addr szBuffer,addr @dwRead,NULL
.if eax
invoke _GetStringValue,addr szBuffer,10
mov @dwTotalByte,eax
.endif
;********************************************************************
; 建立存盘文件
;********************************************************************
invoke _GetSaveFile,addr @szBuffer,sizeof @szBuffer
.if ! eax
mov ebx,offset szAbort
jmp _DL_Err1
.endif
invoke CreateFile,addr @szBuffer,GENERIC_READ or GENERIC_WRITE,\
FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
.if eax == INVALID_HANDLE_VALUE
mov ebx,offset szWriteError
jmp _DL_Err1
.endif
mov @hSaveFile,eax
mov @dwNowReadByte,0
;********************************************************************
; 接收数据并存盘
;********************************************************************
invoke SetDlgItemText,hWinMain,IDOK,addr szStop
invoke GetDlgItem,hWinMain,IDOK
invoke EnableWindow,eax,TRUE
.repeat
.if dwFlag & F_ABORT
mov ebx,offset szAbort
jmp _DL_Err2
.endif
invoke InternetReadFile,@hHttpFile,addr szBuffer,sizeof szBuffer,addr @dwRead
.if eax
.break .if @dwRead == 0
invoke WriteFile,@hSaveFile,addr szBuffer,@dwRead,\
addr @dwWrite,NULL
mov eax,@dwRead
add @dwNowReadByte,eax
xor eax,eax
.if @dwTotalByte
mov eax,@dwNowReadByte
mov ecx,100
mul ecx
div @dwTotalByte
.endif
invoke wsprintf,addr szBuffer,addr szFormat,@dwNowReadByte,eax
invoke _ShowInfo,addr szBuffer
.else
invoke SetDlgItemText,hWinMain,IDC_INFO,addr szReadError
.break
.endif
.until 0
mov ebx,offset szFinish
_DL_Err2:
invoke CloseHandle,@hSaveFile
_DL_Err1:
invoke InternetCloseHandle,@hHttpFile
_DL_Err:
invoke InternetCloseHandle,@hSession
_DL_Ret:
.if ebx
invoke _ShowInfo,ebx
.endif
invoke SetDlgItemText,hWinMain,IDOK,addr szStart
invoke GetDlgItem,hWinMain,IDOK
invoke EnableWindow,eax,TRUE
invoke GetDlgItem,hWinMain,IDC_URL
invoke EnableWindow,eax,TRUE
invoke CloseHandle,hThread
mov hThread,0
popad
ret
_DownLoad endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 主窗口程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_MainDialogProc proc uses ebx edi esi hWnd,wMsg,wParam,lParam
mov eax,wMsg
.if eax == WM_CLOSE
.if hThread
invoke TerminateThread,hThread,-1
.endif
invoke EndDialog,hWinMain,NULL
;********************************************************************
.elseif eax == WM_INITDIALOG
mov eax,hWnd
mov hWinMain,eax
invoke _CenterWindow,hWinMain
;********************************************************************
.elseif eax == WM_COMMAND
mov eax,wParam
movzx eax,ax
.if eax == IDC_URL
invoke GetDlgItemText,hWnd,IDC_URL,addr szUrl,sizeof szUrl
invoke lstrlen,addr szUrl
mov ebx,eax
invoke GetDlgItem,hWnd,IDOK
.if ! hThread
invoke EnableWindow,eax,ebx
.endif
.elseif eax == IDOK
.if hThread
or dwFlag,F_ABORT
.else
invoke CreateThread,NULL,0,offset _DownLoad,NULL,\
NULL,addr hThread
.endif
.endif
;********************************************************************
; 注意:对话框的消息处理后,要返回 TRUE,对没有处理的消息
; 要返回 FALSE
;********************************************************************
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_MainDialogProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 程序开始
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke InitCommonControls
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _MainDialogProc,0
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -