다음의 예제는 http://www.openserver.co.kr/DevX.zip 파일을 다운로드하는 방법을 설명한다.
Win32API의 WinINET이라는 고수준 라이브러리르 사용하는 방법을 설명한다.
해당파일을 다운로드해서 saved.zip이라는 파일로 변경하는 여러가지 기법이 설명된다.
DevX를 이미 공부했다면 특별한 주석이 없어도 이해할 것이다. 못한다고 자책하지 말기 바란다.!!
include wininet.inc
includelib wininet.lib
.data
fileUrl db "http://www.openserver.co.kr/DevX.zip",0
fileSave db "saved.zip",0
msgOk db "다운로드 성공!",0
msgErr db "다운로드 실패!",0
mcap db "다운로드 결과",0
.data?
AppName db 127 dup(?)
fHand dd ?
bwrite dd ?
.code
GetInetFile proc
LOCAL Buffer[1024]: BYTE
LOCAL hSession: DWORD
LOCAL hUrl: DWORD
LOCAL Bufferlen: DWORD
invoke GetModuleFileName, hInstance, addr AppName, sizeof AppName
invoke InternetOpen, addr AppName, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL
mov hSession, eax
.if hSession == INVALID_HANDLE_VALUE
mov eax, FALSE
ret
.endif
invoke InternetOpenUrl, hSession, addr fileUrl, NULL, NULL, NULL, NULL
mov hUrl, eax
.if hUrl == INVALID_HANDLE_VALUE
mov eax, FALSE
ret
.endif
invoke CreateFile, addr fileSave, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\
NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL
mov fHand, eax
.if fHand == INVALID_HANDLE_VALUE
mov eax, FALSE
ret
.endif
invoke SetFilePointer, fHand, NULL, NULL, FILE_BEGIN
download:
invoke InternetReadFile, hUrl, addr Buffer, sizeof Buffer, addr Bufferlen
.if Bufferlen != 0
invoke WriteFile, fHand, addr Buffer, Bufferlen, ADDR bwrite, NULL
jmp download
.endif
invoke CloseHandle, fHand
invoke InternetCloseHandle, hUrl
invoke InternetCloseHandle, hSession
mov eax, TRUE
ret
GetInetFile endp
; 다음과 같이 호출해서 사용하면 된다... 결국 "GetInetFile"이라는 프로시져이다.
invoke GetInetFile
.if eax == TRUE
invoke MessageBox, hWin, addr msgOk, addr mcap, MB_OK
.else
invoke MessageBox, hWin, addr msgErr, addr mcap, MB_OK
.endif