DoRi 홈 24시


[게시판 추가]사진들
[게시판 추가]책읽기
[게시판 추가]카페,술집
델파이 강좌 QnA

DoRi24 소개

0 / 0
자동로그인


방명록

주저리주저리



접속된 회원 및 총회원 목록보기

현재 0분께서 회원으로 접속해 있습니다. 0
2  1/1
  View Articles
  [homepage]님께서 남기신 글 (2003-02-08 19:55:02, Hit : 12616)
File 1 :  WinINetUtil.pas (1.3 KB)   Download : 145
File 2 :  WebFileDown.exe (387.0 KB)   Download : 124
웹파일 다운하기 -- WinINet 을 이용

안녕하세요!

웹 파일 다운 로드 하는 방법을 알아 보도록 합시다.
음 여러가지 방법이 있지만, 오늘은 WinINet 을 이용하겠습니다.

WinSock 이 저수준 함수로 이루어 졌다면
WinInet 이라는 고수준의 라이브러리가 있습니다.

WinInet 은 Http, FTP, Gopher 프로토콜 까지 이미 구현 되어 있습니다.

WinINet 은 MS에서 제공하는 Windows API 입니다.
이걸 델파이에서 사용하기 편하도록 WinInet.pas 파일 형태로 지원해 주고 있습니다.
음 정말 친절한 볼랜드 네요.

WinINet 에 관한 더 자세한 거는 MSDN을 참조하시고,
나중에 WinINet에 관한 설명은 따로 강좌를 마련하도록 하겠습니다.

일단 바로 코딩을 해볼까요

uses 절에 WinInet 을 추가하세요.

그리고
아래 함수를 하나 만들어 볼까요

function InternetFileDown(AURL: string; ALocalFile: string): Boolean;
var
   hSession: HINTERNET; // 인터넷 세션
   hFile: HINTERNET; // 파일 핸들

   FileStream: TFileStream;
   Buffer: array[0..2047] of Byte;
   ReadByte: Cardinal;

begin

   hSession := nil;
   hFile := nil;

   Result := False;

   // 세션 열기
   hSession := InternetOpen(PChar('DoRi Agent'), INTERNET_OPEN_TYPE_PRECONFIG,
               nil, nil, INTERNET_FLAG_DONT_CACHE);

   if hSession = nil then Exit;

   try
     // URL 파일 열기
     hFile := InternetOpenUrl(hSession, PChar(AURL), nil, 0, INTERNET_FLAG_DONT_CACHE, 0);

     if hFile = nil then Exit;

     // 파일 스트림열기
     FileStream := TFileStream.Create(ALocalFile, fmCreate);

     try
         // URL 파일 -> 파일 스트림
         while (InternetReadFile(hFile, @Buffer[0], 2048, ReadByte)) do
         begin

            if ReadByte = 0 then break;

            FileStream.WriteBuffer(Buffer, ReadByte);
         end;
         Result := True;

     finally
         FileStream.Free;
     end;

   InternetCloseHandle(hFile);

   finally
      InternetCloseHandle(hSession);
   end;

end;  // --> InternetFileDown


사용은 아래와 같이 하시면 됩니다.

  if InternetFileDown(edtURL.Text, edtFile.Text) then

    ShowMessage('다운로드성공')

  else

    ShowMessage('다운로드실패');



첨부파일은 제가 파일 다운 받도록 .pas 파일로 만들었습니다.

위에서 WinINet 파일은 바로 File로 변환이 불가능 합니다.
그래서 파일 스트림으로 복사하는 것입니다.


HINTERNET InternetOpen(
  LPCTSTR lpszAgent,
  DWORD dwAccessType,
  LPCTSTR lpszProxyName,
  LPCTSTR lpszProxyBypass,
  DWORD dwFlags
);

InternetOpen() 함수는 WinINet 을 사용하기 위해 초기화 하는 함수 입니다. HINTERNET  핸들을 넘겨 줍니다.
첫번째 인자 PChar('DoRi Agent') 는
아무거나 쓰면 됩니다.  인터넷에 접근할때는 항상 자기가 어떤 일을 하기 위해 접근했다는 것을 나타 내기 위해 자기 이름을 밝힌다고 생각 하면 됩니다. 그게 바로 이것입니다.

두번째 인자는 access 타입입니다.
- INTERNET_OPEN_TYPE_DIRECT
- INTERNET_OPEN_TYPE_PRECONFIG
- INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY
- INTERNET_OPEN_TYPE_PROXY
이 타입중 하나만 선택해서 넣어 주면 됩니다.
자세한 거는 나중에 한번 강좌를 하겠습니다. MSDN을 보셔도 좋구요..!!! ^^;

세번째와 네번째는 프록시와 관련된 것입니다.

다섯번째는 아래 3개의 인자를 조합하여 사용하면 됩니다.
- INTERNET_FLAG_ASYNC
- INTERNET_FLAG_FROM_CACHE
- INTERNET_FLAG_OFFLINE


InternetOpenUrl

함수는 Http, Gopher, FTP 에서 리소스를 열는 역활을 합니다.

HINTERNET InternetOpenUrl(
  HINTERNET hInternet,
  LPCTSTR lpszUrl,
  LPCTSTR lpszHeaders,
  DWORD dwHeadersLength,
  DWORD dwFlags,
  DWORD_PTR dwContext
);

Parameters
첫번째 인자는 현재 인터넷 Session의 핸들이고,
두번째 인자는 URL 이고, ftp:, gopher:, http:, https: 이것중 하나로 반드시 시작해야 된다.
세번째 인자는 http 서버에 보내지는 해더이다.
네번째 인자는 해더의 길이이고,
다섯번째 인자는 19개의 FLAG 들인데, 읽어 올때 어떤 형태로 읽어 올지 선택하는 것이다.
마지막 인자는 어플리케이션에서 선언되어서 리턴된 핸들을 가지고 callback 함수를 통과하는 변수의 포인터 이다.

아래는 WinInet.pas에 선언된 InternetOpenURL 함수이다.

function InternetOpenUrl(hInet: HINTERNET; lpszUrl: PChar;
  lpszHeaders: PChar; dwHeadersLength: DWORD; dwFlags: DWORD;
  dwContext: DWORD): HINTERNET; stdcall;


Prev
   델파이 강좌 게시판입니다.

Copyright 1999-2024 Zeroboard / skin by Go!JiNny

Copyright DoRi24.com (주)도리
dori@dori24.com