?? 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 + -