728x90
1. XML 이란?

  참으로 오래간만에 사이트를 다시 열었네요.. 예전의 xmlis.pe.kr로 운영했었는데 사정상 이 사이트로 바꾸게 되었습니다. 지난번보다는 좀더 나은 강좌로 여러분을 찾아가고자 합니다. 그럼, 부족하지만 함 시작해 보기로 하겠습니다.

 

  이제는 SQL-2000은 보편화되어 많이 사용되고 있습니다. SQL-2000은 DB 차원에서 XML을 지원하기 시작한 거였죠.. 물론 그전에도 타미노나 엑서스였던가요? XML에서 출발한 DB는 있었지만-.- 그런데 얼마전 Oracle XML DB도 발표되었습니다. 자료를 보셨는지 모르겠군요.. 아마도 OTN 사이트에 가면 있을 겁니다.

 

  어쨌거나 XML은 1998년 2월 W3C에서 첨 XML 표준을 발표한 이래 정말 꾸준히 발전하면서 세인들의 관심을 끌어오고 있습니다. 엄청난 영향력인 셈이죠.. 아마도 이 사이트를 찾으신 분들도 그런 영향을 받지 않았을까 싶네요..



  우연찮게 저는 1998년 말부터 XML을 접하게 되었습니다. 그래서 XParser라는 XML파서도 개발하였구요. 각종 XML관련된 일을 하게 되었지요. 엥~~ 왠 지자랑!!

그래서 제가 알고 있는 조그마한 지식이나마 첨으로 XML을 시작하는 분들에게 도움을 줄 수 있으면~ 하네요.



에궁.. 서론이 넘 길었죠.. 자 이제부터 저랑 함께 XML의 세계로 접근해 보자구요!!



XML이 왜 필요하게 되었을까요?



웹에서 사용하기에 HTML은 지금도 잘 쓰이고 있습니다. 그죠.. 거기에 자바스크립트, DHTML, CGI, ASP, PHP...

을 통해서 이제는 동적인 페이지의 구성도 가능하죠.. 하지만 그 이면에는 우리도 느끼지 못하는 문제점이 있네요.



첫째로 NT-IIS-ASP-MSSQL, LINUX-Apache-PHP-MySQL 무얼 말하려는지 눈치 채셨나요?

바로 호환성입니다. 여기에 지금은 그나마 나아졌지만 초기에 IE와 넷스케이프의 호환도 엄청난 문제였죠.

즉, 정적인 HTML의 기능을 보완하다 보니 각 스크립트, 제품별로 상호호환이 안되는 거죠.



둘째로는 홈페이지를 새롭게 개편한다고 해보죠.. 디자인이 바뀌면 HTML페이지의 내용이 모두 바꿉니다.

그죠.. 물론 텍스트니까 복사&붙여넣기를 사용한다고 해도 넘 불편하죠..

즉, 디자인 부분만 바뀌면 되는데,, 데이터부분도 바꾸어야 하는 거죠..



셋째로 만약 악보를 웹에서 표현하고 싶다면 어떻게 할까요? 이미지로 그려야겠죠.. 그럼 그 그림을 다른 사람에게 보내면

그 사람이 그 악보를 해석해 낼 수 있을까요? 당연히 하죠.. 사람인데..

하지만 컴퓨터는 해석할 수 없죠... 이미지 프로세싱도 아니고 그림에서 어디가 '도''레''미'인지 컴퓨터가 어찌 알겠습니까?



이런걸 XML로 해결할 수 있다는 겁니다.



여기에서 잠시만 뻘소리를 좀 하자면, 제가 이렇게 막 XML이 좋다고 설명을 하면 마치 XML을 만병통치약 정도로 생각하는 사람들이 있습니다.

죄송하지만 아직 XML은 만들어지고 있는 언어입니다. 즉, 이론은 모두 나와 있지만 실제로는 제한된 부분만 구현이 되고 있습니다.

아마도 2~3년 내에는 실제로 모든 구현도 이루어 질수 있으리라고는 보지만,, 지금은 일단 추세를 따라가 주는 것이 중요할 듯합니다.

잠시.. 헛소리였습니다... 지송함다..



그렇다고 이러한 표준이 XML이 먼저는 아니었습니다. 아실분은 다 아시죠.. SGML(표준화된 일반 마크업 언어)라구요..

SGML은 실제로 정부 기관에서 많이 사용되었습니다. 하지만 넘 덩치가 큰 표준이었고요..

웹이 발달하기 이전에 나온 것이라 웹에 대한 지원이 미약했습니다. 하지만 이것이 바로 XML의 부모인 셈이죠..

XML은 SGML에서 사용되는 많은 기술들을 받아들여서 간소화하고 보완하면서 현재 발전해 나가고 있습니다.

아래 그림을 그걸 간단히 보여주고 있습니다.





                           <그림 : SGML과 XML의 관계>



자 이제 정리 해 보도록 하죠... 하~~ 역시 말로만 설명하는 건 넘 어렵죠.. 걱정 마세요. 담부터는 예제 중심으로 설명하도록 하죠.

지도 힘드네요.. 말도 잘 못하는 것이 주저리주저리 타이핑하려니 장난이 아니군요.. T__T



XML의 장점이 뭐죠?



1. 문서의 내용과 디자인이 완전히 분리 되어 있다는 겁니다. 즉, 문서의 구조와 프리젠테이션의 분리라 할 수 있죠.

문서의 구조는 XML문서를 통해서 트리구조의 구조적인 형태로 나타냅니다. 그리고 출력, 포매팅은 XSL 문서를 통해서 나타낼 수 있습니다.

   

2. 다양한 방식의 링크 기능을 제공합니다. XLink, XPointer를 이용하면 기존 HTML에서 이용하던 하이퍼링크 이상의 기능을 발휘할 수 있습니다.

자세한 내용은 강좌를 진행하면서 설명하도록 하죠.



3. 표준화된 DTD를 통해서 모든 분야에서 사용이 가능합니다. 요즘 많이 사용되는 WML, SMIL, SVG등이 모두 XML에 기반을 둔

언어입니다. 이것은 XML의 DTD를 선언하고 모든 사용자가 그 규칙에 맞추어 사용하면 컴퓨터나 사람이 모두 해석할 수 있는 메타 언어가 된다는 거죠.



야.. 갑작스럽게 어려운 용어가 많이 나왔네요.. 이론... 머리가 어지럽네요.. 앞으로 차근차근 제가 아는 것만큼 설명해 드리도록 하죠..



XML 문서의 구조와 포매팅의 구분



여기서는 참고로 XML의 구조와 포매팅의 분리에 대해서 설명을 좀 더 할까 합니다.

자동차를 하나 예로 들어서 설명을 해보죠.. 자동차 음~~ 현대 아반테의 엔진에 대한 설명서를 XML문서로 하나 가지고 있다고 해보죠.



그렇다면 지금 XML 문서는 준비가 되어 있는 겁니다. 그리고 포매팅을 할 수 있는 것이 없는 상태죠.

차 엔진 설명서에는 XML 형태로 아반테의 엔진에 대한 모든 내용이 포함되어 있습니다.



아반테를 생산하는 공장에서는 엔진을 조립하는 방법이 필요합니다.

그리고 차를 수리하는 카센타와 같은 곳에서는 엔진이 고장났을 때 수리하는 방법이 필요합니다.

마지막으로 차량 구입자에게는 아반테 엔진을 사용하는 방법의 설명서가 필요합니다.



이런걸 기존의 미디어라면 모두 각각 만들어야 합니다.

하지만 XML이라면 포매팅만 새롭게 해주면 기존의 XML문서를 이용하여 모두 만들어 낼 수 있습니다.

XML이라는 것이 좀더 매력으로 느껴지지 않으세요?? 안그런가? 쩝... 어쨌던~~



어떻게 그럴수 있을까요?? XSLT라고요.. XML을 변환하는 것에 대한 표준안이 W3C에서 이미 발표된 상태입니다.

각 벤더들이 그에 대한 솔루션을 각각 발표하겠죠..



또한 이 XSLT를 이용하면 다른 미디어로도 출판이 가능하다고 합니다.

즉, 위의 아반테 엔진을......



CD-ROM 버전으로 출판할 수 있구요.

웹에서 사용할 수 있는 형태로 출판할 수도 있구요..

요즘 많이 사용되는 PDA에서 사용할 있도록 나타낼 수도 있답니다.



실제로 제가 본 것은요.. XSL의 포매팅 객체 (Formatting Object)를 이용해서 PDF파일(아크로뱃리더)형식과 HTML과 WAP의

3가지 형태로 출력하는 외국의 사이트를 본적이 있네요.. (http://www.renderx.com/)



이제는 이런 형태의 XML이용이 점차 보편화 되고 있는 추세죠..



첫 강좌는 여기까집니다. 휴~~ 그럼.......   2002/08/01  From 미니

[출처 : 미니의 XML DeveloperGroup (http://www.word.pe.kr)]

'프로그램언어 > XML' 카테고리의 다른 글

6. XSL & XML  (0) 2008.06.02
5. DTD & XML  (0) 2008.05.28
4. DTD란?  (0) 2008.05.14
3. XML의 구성요소  (0) 2008.05.14
2. XML의 시작  (0) 2008.05.14
728x90

'-----------------------------------------------------------------
'
'WININET.TXT -- WININET API 선언문
' 비주얼 베이직용, Copyright (C) 1998 Microsoft Corporation
' 이 파일은 비주얼 베이직 6.0 의 API 뷰어가 필요합니다.
'
'-----------------------------------------------------------------
' WinINET API 선언문
' API 뷰어에서도 쓰기 쉽게 만들었습니다.
' 확장자를 bas로 바꿔서 그대로 써도 됩니다.
' 주석은 대충 번역해봤습니다. -_-; 따라서 정확도가 좀 떨어집니다.
'
http://www.howtobank.net - 지상현이 수정함 -_-;
'-----------------------------------------------------------------


' ***** WININET 상수 *****
' 경로의 최대 길이
Const MAX_PATH = 260
' 오류가 없습니다.
Const NO_ERROR = 0


' ***** 파일 속성 상수 *****
' 읽기 전용입니다.
Const FILE_ATTRIBUTE_READONLY = &H1
' 숨김 파일입니다.
Const FILE_ATTRIBUTE_HIDDEN = &H2
' 시스템 파일입니다.
Const FILE_ATTRIBUTE_SYSTEM = &H4

' 디렉토리입니다.
Const FILE_ATTRIBUTE_DIRECTORY = &H10
' 일반적인 문서 파일입니다.
Const FILE_ATTRIBUTE_ARCHIVE = &H20
' 일반적인 파일입니다.
Const FILE_ATTRIBUTE_NORMAL = &H80
' 임시 파일입니다.
Const FILE_ATTRIBUTE_TEMPORARY = &H100
' 압축된 파일입니다.
Const FILE_ATTRIBUTE_COMPRESSED = &H800
' 오프라인 파일(캐쉬된)입니다.
Const FILE_ATTRIBUTE_OFFLINE = &H1000


' 파일의 시간을 나타내는 구조체
Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type


' 파일을 찾기 위한 구조체
Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type


' 더 이상 (찾을 수 있는) 파일이 없습니다.
Const ERROR_NO_MORE_FILES = 18


' 그 다음 파일을 찾습니다.
Declare Function InternetFindNextFile Lib "wininet.dll" Alias "InternetFindNextFileA" (ByVal hFind As Long, lpvFindData As WIN32_FIND_DATA) As Long


' FTP에서, 첫번째 파일을 구합니다.
Declare Function FtpFindFirstFile Lib "wininet.dll" Alias "FtpFindFirstFileA" (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContent As Long) As Long


' FTP에서, 파일을 내려받기 합니다.
Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" (ByVal hFtpSession As Long, ByVal lpszRemoteFile As String, ByVal lpszNewFile As String, ByVal fFailIfExists As Boolean, ByVal dwFlagsAndAttributes As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean


' FTP에서, 파일을 업로드 합니다.
Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hFtpSession As Long, ByVal lpszLocalFile As String, ByVal lpszRemoteFile As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean


' FTP에서, 서버상의 작업 디렉토리를 바꿉니다.
Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean


' FTP에서, 서버상의 작업 디렉토리가 무엇인지 알아옵니다.
Declare Function FtpGetCurrentDirectory Lib "wininet.dll" Alias "FtpGetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String, ByRef lpdwCurrentDirectory As Long) As Boolean


' 응용 프로그램이 Win32 인터넷 함수를 이용하기 위한 초기화

' 새로운 연결을 만들기 전에 인터넷 핸들을 생성합니다.
Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long

' 사용자 정의 User-Agent
Const scUserAgent = "vb wininet"


' ***** 프록시 관련 상수 *****
' Internet Explorer의 설정을 사용합니다.
Const INTERNET_OPEN_TYPE_PRECONFIG = 0
' 프록시 서버를 사용하지 않습니다.
Const INTERNET_OPEN_TYPE_DIRECT = 1
' 지정한 프록시 서버 설정을 사용합니다.
Const INTERNET_OPEN_TYPE_PROXY = 3

' 잘못된 포트 번호를 나타냅니다.
Const INTERNET_INVALID_PORT_NUMBER = 0


' ***** HTTP 세션을 여는 함수들 *****

' 지정한 곳으로 연결합니다.
Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUsername As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long

' 가장 마지막으로 연결했던 곳의 응답 내용을 알아옵니다.
Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" (lpdwError As Long, ByVal lpszBuffer As String, lpdwBufferLength As Long) As Boolean


' ***** 연결하고자 하는 서버의 TCP/IP 포트 번호들 *****
' FTP 포트
Const INTERNET_DEFAULT_FTP_PORT = 21
' GOPHER 포트
Const INTERNET_DEFAULT_GOPHER_PORT = 70
' HTTP 포트
Const INTERNET_DEFAULT_HTTP_PORT = 80
' HTTPS 포트(HTTP 보안 프로토콜)
Const INTERNET_DEFAULT_HTTPS_PORT = 443
' 일반적인 소켓 포트
Const INTERNET_DEFAULT_SOCKS_PORT = 1080


' ***** 옵션 플래그 *****

' 연결할 때, 타임아웃 시간을 지정합니다.
Const INTERNET_OPTION_CONNECT_TIMEOUT = 2
' 전송받을 때, 타임아웃 시간을 지정합니다.
Const INTERNET_OPTION_RECEIVE_TIMEOUT = 6
' 보낼 때, 타임아웃 시간을 지정합니다.
Const INTERNET_OPTION_SEND_TIMEOUT = 5
' 사용자 이름을 지정합니다.
Const INTERNET_OPTION_USERNAME = 28
' 암호를 지정합니다.
Const INTERNET_OPTION_PASSWORD = 29
' 프록시 서버 사용자 이름을 지정합니다.
Const INTERNET_OPTION_PROXY_USERNAME = 43
' 프록시 서버 암호를 지정합니다.
Const INTERNET_OPTION_PROXY_PASSWORD = 44


' ***** 서비스 접근 방법 *****

' FTP 서비스
Const INTERNET_SERVICE_FTP = 1
' GOPHER 서비스
Const INTERNET_SERVICE_GOPHER = 2
' HTTP 서비스
Const INTERNET_SERVICE_HTTP = 3

' HTTP에서, 요청 정보를 보냅니다.
Declare Function HttpOpenRequest Lib "wininet.dll" Alias "HttpOpenRequestA" (ByVal hHttpSession As Long, ByVal sVerb As String, ByVal sObjectName As String, ByVal sVersion As String, ByVal sReferer As String, ByVal something As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long

' 읽기 작업
Const GENERIC_READ = &H80000000
' 쓰기 작업
Const GENERIC_WRITE = &H40000000

' HTTP에서, 추가적인 요청 정보를 보냅니다.
Declare Function HttpSendRequest Lib "wininet.dll" Alias "HttpSendRequestA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal sOptional As String, ByVal lOptionalLength As Long) As Integer

' HTTP에서, 서버가 응답한 데이터를 조회합니다.
Declare Function HttpQueryInfo Lib "wininet.dll" Alias "HttpQueryInfoA" (ByVal hHttpRequest As Long, ByVal lInfoLevel As Long, ByRef sBuffer As Any, ByRef lBufferLength As Long, ByRef lIndex As Long) As Integer


' 표준 인터넷 오류 대화상자를 띄웁니다.
Declare Function InternetErrorDlg Lib "wininet.dll" (ByVal hWnd As Long, ByVal hInternet As Long, ByVal dwError As Long, ByVal dwFlags As Long, ByVal lppvData As Long) As Long


' 인터넷 오류 대화상자 상수
Const FLAGS_ERROR_UI_FILTER_FOR_ERRORS = &H1
Const FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS = &H2
Const FLAGS_ERROR_UI_FLAGS_GENERATE_DATA = &H4
Const FLAGS_ERROR_UI_FLAGS_NO_UI = &H8
Const FLAGS_ERROR_UI_SERIALIZE_DIALOGS = &H10


' 바탕 화면 창의 핸들을 얻습니다.
Declare Function GetDesktopWindow Lib "user32.dll" () As Long

' ***** HTTP 응답 정보 상수들 *****
' 컨텐츠의 형식(Mine 타입 등)을 알아옵니다.
Const HTTP_QUERY_CONTENT_TYPE = 1
' 컨텐츠의 크기를 알아옵니다.
Const HTTP_QUERY_CONTENT_LENGTH = 5
' 컨텐츠의 만료일을 알아옵니다.
Const HTTP_QUERY_EXPIRES = 10
' 컨텐츠의 최종 수정일을 알아옵니다.
Const HTTP_QUERY_LAST_MODIFIED = 11
' 컨텐츠의 프라그마 부가 정보를 알아옵니다.
Const HTTP_QUERY_PRAGMA = 17
' 서버의 HTTP 버전을 알아옵니다.
Const HTTP_QUERY_VERSION = 18
' HTTP 상태 코드를 알아옵니다.
Const HTTP_QUERY_STATUS_CODE = 19
' HTTP 상태 내용을 알아옵니다.
Const HTTP_QUERY_STATUS_TEXT = 20
' HTTP 헤더를 알아옵니다.
Const HTTP_QUERY_RAW_HEADERS = 21
' HTTP 헤더의 줄바꿈 기준 단위를 알아옵니다.
Const HTTP_QUERY_RAW_HEADERS_CRLF = 22
' 포워딩 되었는지를 알아옵니다.
Const HTTP_QUERY_FORWARDED = 30
' HTTP 서버 정보를 알아옵니다.
Const HTTP_QUERY_SERVER = 37
' User-Agent를 알아옵니다.
Const HTTP_QUERY_USER_AGENT = 39
' 쿠키를 설정합니다.
Const HTTP_QUERY_SET_COOKIE = 43
' 요청 방법을 알아옵니다.
Const HTTP_QUERY_REQUEST_METHOD = 45

' 요청이 거부되었습니다.
Const HTTP_STATUS_DENIED = 401
' 프록시 서버 인증이 필요합니다.
Const HTTP_STATUS_PROXY_AUTH_REQ = 407


' 가져올 헤더에 플래그로 추가하는 상수
' 헤더들을 가져옵니다.
Const HTTP_QUERY_FLAG_REQUEST_HEADERS = &H80000000
' 숫자 정보를 얻습니다.
Const HTTP_QUERY_FLAG_NUMBER = &H20000000


' HttpOpenRequest 함수로 열린 인터넷 핸들에서, 데이터를 읽습니다.
Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Integer


' 인터넷 버퍼 구조체 설명
'Type INTERNET_BUFFERS
'    dwStructSize As Long ' 구조체의 크기
'    Next As Long ' 다음 버퍼의 포인터; VB에서 사용 불가
'    lpcszHeader As Long ' 헤더의 포인터 (NULL 가능합니다)
'    dwHeadersLength As Long ' 헤더를 사용할 경우 헤더의 길이
'    dwHeadersTotal As Long ' 모든 헤더의 크기
'    lpvBuffer As Long ' 데이터를 받을 버퍼의 포인터(NULL 가능합니다).
'    dwBufferLength As Long ' 데이터를 받을 버퍼의 크기(필수)
'    dwBufferTotal As Long ' 모든 버퍼의 크기
'    dwOffsetLow As Long ' 읽는 크기
'    dwOffsetHigh As Long ' 읽는 크기, 64비트용
'End Type

Type INTERNET_BUFFERS
    dwStructSize As Long
    Next As Long
    lpcszHeader As Long
    dwHeadersLength As Long
    dwHeadersTotal As Long
    lpvBuffer As Long
    dwBufferLength As Long
    dwBufferTotal As Long
    dwOffsetLow As Long
    dwOffsetHigh As Long
End Type

' HTTP에서, 확장 요청 정보를 보냅니다.
Declare Function HttpSendRequestEx Lib "wininet.dll" Alias "HttpSendRequestExA" (ByVal hHttpRequest As Long, lpBuffersIn As INTERNET_BUFFERS, ByVal lpBuffersOut As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long

' HTTP에서, 요청을 종료합니다.
Declare Function HttpEndRequest Lib "wininet.dll" Alias "HttpEndRequestA" (ByVal hHttpRequest As Long, ByVal lpBuffersOut As Long, ByVal dwFlags As Long, ByVal dwContext As Long) As Long

' 열린 인터넷 핸들에 데이터를 씁니다.
Declare Function InternetWriteFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As String, ByVal lNumberOfBytesToRead As Long, lNumberOfBytesRead As Long) As Integer

' FTP에서, 파일을 엽니다.
Declare Function FtpOpenFile Lib "wininet.dll" Alias "FtpOpenFileA" (ByVal hFtpSession As Long, ByVal sFileName As String, ByVal lAccess As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long

' FTP에서, 파일을 지웁니다.
Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, ByVal lpszFileName As String) As Boolean

' 인터넷 핸들의 여러 가지 설정 정보를 설정합니다.
Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" (ByVal hInternet As Long, ByVal lOption As Long, ByRef sBuffer As Any, ByVal lBufferLength As Long) As Integer

' (VB용) InternetSetOption 함수와 같으나, 설정 정보를 전달하는 인자를 문자열 형으로 따로 선언했습니다.
Declare Function InternetSetOptionStr Lib "wininet.dll" Alias "InternetSetOptionA" (ByVal hInternet As Long, ByVal lOption As Long, ByVal sBuffer As String, ByVal lBufferLength As Long) As Integer

' 인터넷 핸들을 닫습니다. 사용이 끝난 인터넷 핸들은 반드시 닫아줘야 합니다.
Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer

' 인터넷 핸들로부터 설정된 여러 가지 설정 정보를 조회합니다.
Declare Function InternetQueryOption Lib "wininet.dll" Alias "InternetQueryOptionA" (ByVal hInternet As Long, ByVal lOption As Long, ByRef sBuffer As Any, ByRef lBufferLength As Long) As Integer


' Wininet.dll의 버전을 알아옵니다.
Const INTERNET_OPTION_VERSION = 40

' 윈도우즈 인터넷 함수(Wininet.dll)이 담고 있는 DLL의 버전 정보를 알아오는 함수.
'functions (Wininet.dll). This structure is used when passing the
' 이 구조체는 INTERNET_OPTION_VERSION 플래그를 InternetQueryOption 함수로 넘겼을 때
' 반환됩니다.
Type tWinInetDLLVersion
    lMajorVersion As Long
    lMinorVersion As Long
End Type

'Adds one or more HTTP request headers to the HTTP request handle.
' HTTP 요청 핸들에 추가적인 HTTP 요청 헤더를 추가합니다.
Declare Function HttpAddRequestHeaders Lib "wininet.dll" Alias "HttpAddRequestHeadersA" (ByVal hHttpRequest As Long, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lModifiers As Long) As Integer

' 이 플래그는 이 함수의 의미적인 면을 바꿉니다.
' 다음의 값들을 가질 수 있습니다:

' 같은 것이 없을때만 헤더를 추가합니다. 아니면, 오류를 반환합니다.
Const HTTP_ADDREQ_FLAG_ADD_IF_NEW = &H10000000

' 헤더가 존재하지 않을때만 추가합니다. HTTP_ADDREQ_FLAG_REPLACE 플래그와 함께 사용합니다.
Const HTTP_ADDREQ_FLAG_ADD = &H20000000

' 헤더를 바꾸거나, 제거합니다. 만약 헤더 값이 비어있거나 같은 헤더가 있다면,
' 헤더를 제거합니다. 만약 비어있지 않다면, 헤더 값을 바꿉니다.
Const HTTP_ADDREQ_FLAG_REPLACE = &H80000000

' ***** 인터넷 오류 상수 *****
' 오류 기본 값(나머지 오류 값은 이 값을 더해서 사용합니다)
Const INTERNET_ERROR_BASE = 12000
' 핸들의 범위를 벗어났습니다.
Const ERROR_INTERNET_OUT_OF_HANDLES = (INTERNET_ERROR_BASE + 1)
' 타임 아웃으로 인해 종료되었습니다.
Const ERROR_INTERNET_TIMEOUT = (INTERNET_ERROR_BASE + 2)
' 파생된 오류 입니다.
Const ERROR_INTERNET_EXTENDED_ERROR = (INTERNET_ERROR_BASE + 3)
' 내부 오류가 발생하였습니다.
Const ERROR_INTERNET_INTERNAL_ERROR = (INTERNET_ERROR_BASE + 4)
' URL이 올바르지 않습니다.
Const ERROR_INTERNET_INVALID_URL = (INTERNET_ERROR_BASE + 5)
' 인증되지 않은 스키마입니다.
Const ERROR_INTERNET_UNRECOGNIZED_SCHEME = (INTERNET_ERROR_BASE + 6)
' 호스트 이름이 고정되지 않았습니다: 호스트를 찾을 수 없습니다.
Const ERROR_INTERNET_NAME_NOT_RESOLVED = (INTERNET_ERROR_BASE + 7)
' 프로토콜을 찾을 수 없습니다: 프로토콜이 잘못 되었습니다.
Const ERROR_INTERNET_PROTOCOL_NOT_FOUND = (INTERNET_ERROR_BASE + 8)
' 설정 값이 잘못 되었습니다.
Const ERROR_INTERNET_INVALID_OPTION = (INTERNET_ERROR_BASE + 9)
' 설정 값의 길이가 잘못 되었습니다.
Const ERROR_INTERNET_BAD_OPTION_LENGTH = (INTERNET_ERROR_BASE + 10)
' 설정 값이 기록되지 않았습니다.
Const ERROR_INTERNET_OPTION_NOT_SETTABLE = (INTERNET_ERROR_BASE + 11)
' 셧다운 되버렸습니다: 연결이 강제로 끊겼습니다.
Const ERROR_INTERNET_SHUTDOWN = (INTERNET_ERROR_BASE + 12)
' 사용자 이름이 올바르지 않습니다.
Const ERROR_INTERNET_INCORRECT_USER_NAME = (INTERNET_ERROR_BASE + 13)
' 사용자 암호가 올바르지 않습니다.
Const ERROR_INTERNET_INCORRECT_PASSWORD = (INTERNET_ERROR_BASE + 14)
' 로그인을 실패 하였습니다.
Const ERROR_INTERNET_LOGIN_FAILURE = (INTERNET_ERROR_BASE + 15)
' 작업이 잘못 되었습니다.
Const ERROR_INTERNET_INVALID_OPERATION = (INTERNET_ERROR_BASE + 16)
' 작업이 취소 되었습니다.
Const ERROR_INTERNET_OPERATION_CANCELLED = (INTERNET_ERROR_BASE + 17)
' 핸들 형식이 잘못 되었습니다.
Const ERROR_INTERNET_INCORRECT_HANDLE_TYPE = (INTERNET_ERROR_BASE + 18)
' 핸들 상태가 잘못 되었습니다.
Const ERROR_INTERNET_INCORRECT_HANDLE_STATE = (INTERNET_ERROR_BASE + 19)
' 프록시 서버의 요청이 아닙니다.
Const ERROR_INTERNET_NOT_PROXY_REQUEST = (INTERNET_ERROR_BASE + 20)
' 레지스트리 값을 찾을 수 없습니다.
Const ERROR_INTERNET_REGISTRY_VALUE_NOT_FOUND = (INTERNET_ERROR_BASE + 21)
' 레지스트리 매개 변수가 잘못 되었습니다.
Const ERROR_INTERNET_BAD_REGISTRY_PARAMETER = (INTERNET_ERROR_BASE + 22)
' 직접 접근을 할 수 없습니다.
Const ERROR_INTERNET_NO_DIRECT_ACCESS = (INTERNET_ERROR_BASE + 23)
' 컨텍스트를 얻을 수 없습니다.
Const ERROR_INTERNET_NO_CONTEXT = (INTERNET_ERROR_BASE + 24)
' 콜백 함수 설정에 실패하였습니다.
Const ERROR_INTERNET_NO_CALLBACK = (INTERNET_ERROR_BASE + 25)
' 요청이 중복 실행되어 지연되고 있습니다.
Const ERROR_INTERNET_REQUEST_PENDING = (INTERNET_ERROR_BASE + 26)
' 형식이 올바르지 않습니다.
Const ERROR_INTERNET_INCORRECT_FORMAT = (INTERNET_ERROR_BASE + 27)
' 항목을 찾을 수 없습니다.
Const ERROR_INTERNET_ITEM_NOT_FOUND = (INTERNET_ERROR_BASE + 28)
' 연결할 수 없습니다.
Const ERROR_INTERNET_CANNOT_CONNECT = (INTERNET_ERROR_BASE + 29)
' 연결이 강제로 종료 되었습니다.
Const ERROR_INTERNET_CONNECTION_ABORTED = (INTERNET_ERROR_BASE + 30)
' 연결이 초기화 되었습니다.
Const ERROR_INTERNET_CONNECTION_RESET = (INTERNET_ERROR_BASE + 31)
' 강제로 다시 시도 합니다.
Const ERROR_INTERNET_FORCE_RETRY = (INTERNET_ERROR_BASE + 32)
' 잘못된 프록시 서버 요청입니다.
Const ERROR_INTERNET_INVALID_PROXY_REQUEST = (INTERNET_ERROR_BASE + 33)
' UI가 필요합니다.
Const ERROR_INTERNET_NEED_UI = (INTERNET_ERROR_BASE + 34)
' 핸들이 존재합니다.
Const ERROR_INTERNET_HANDLE_EXISTS = (INTERNET_ERROR_BASE + 36)
' 인증서의 날짜가 잘못 되었습니다.
Const ERROR_INTERNET_SEC_CERT_DATE_INVALID = (INTERNET_ERROR_BASE + 37)
' 인증서가 잘못 되었습니다.
Const ERROR_INTERNET_SEC_CERT_CN_INVALID = (INTERNET_ERROR_BASE + 38)
' HTTP 에서 HTTPS로 재연결 됩니다.
Const ERROR_INTERNET_HTTP_TO_HTTPS_ON_REDIR = (INTERNET_ERROR_BASE + 39)
' HTTPS 에서 HTTP로 재연결 됩니다.
Const ERROR_INTERNET_HTTPS_TO_HTTP_ON_REDIR = (INTERNET_ERROR_BASE + 40)
' 보안 모드와 일반 모드가 섞여있습니다.
Const ERROR_INTERNET_MIXED_SECURITY = (INTERNET_ERROR_BASE + 41)
' 보안 되지 않은 CHG 폼 입니다.
Const ERROR_INTERNET_CHG_POST_IS_NON_SECURE = (INTERNET_ERROR_BASE + 42)
' 보안 되지 않은 폼 입니다.
Const ERROR_INTERNET_POST_IS_NON_SECURE = (INTERNET_ERROR_BASE + 43)
' 클라이언트의 인증서가 필요합니다.
Const ERROR_INTERNET_CLIENT_AUTH_CERT_NEEDED = (INTERNET_ERROR_BASE + 44)
' 인증서가 잘못 되었습니다.
Const ERROR_INTERNET_INVALID_CA = (INTERNET_ERROR_BASE + 45)
' 클라이언트에 인증서가 설치되지 않았습니다.
Const ERROR_INTERNET_CLIENT_AUTH_NOT_SETUP = (INTERNET_ERROR_BASE + 46)
' 비동기 쓰레드 생성에 실패 하였습니다.
Const ERROR_INTERNET_ASYNC_THREAD_FAILED = (INTERNET_ERROR_BASE + 47)
' 재연결 스키마가 변경 되었습니다.
Const ERROR_INTERNET_REDIRECT_SCHEME_CHANGE = (INTERNET_ERROR_BASE + 48)
' 대화 상자가 지연되고 있습니다.
Const ERROR_INTERNET_DIALOG_PENDING = (INTERNET_ERROR_BASE + 49)
' 재시도 대화 상자
Const ERROR_INTERNET_RETRY_DIALOG = (INTERNET_ERROR_BASE + 50)
' HTTPS 에서 HTTP로 재연결 하면서 전송합니다.
Const ERROR_INTERNET_HTTPS_HTTP_SUBMIT_REDIR = (INTERNET_ERROR_BASE + 52)
' CD-ROM을 삽입해 주세요.
Const ERROR_INTERNET_INSERT_CDROM = (INTERNET_ERROR_BASE + 53)


' ***** FTP 오류 상수 *****
' 이미 전송 작업이 진행중 입니다.
Const ERROR_FTP_TRANSFER_IN_PROGRESS = (INTERNET_ERROR_BASE + 110)
' FTP 연결이 다운 되었습니다.
Const ERROR_FTP_DROPPED = (INTERNET_ERROR_BASE + 111)
' Passive 모드가 아닙니다.
Const ERROR_FTP_NO_PASSIVE_MODE = (INTERNET_ERROR_BASE + 112)

' ***** Gopher 오류 상수 *****
' Gopher 프로토콜 오류입니다.
Const ERROR_GOPHER_PROTOCOL_ERROR = (INTERNET_ERROR_BASE + 130)
' 파일이 아닙니다.
Const ERROR_GOPHER_NOT_FILE = (INTERNET_ERROR_BASE + 131)
' 데이터 오류입니다.
Const ERROR_GOPHER_DATA_ERROR = (INTERNET_ERROR_BASE + 132)
' 데이터의 끝입니다.
Const ERROR_GOPHER_END_OF_DATA = (INTERNET_ERROR_BASE + 133)
' 로케이터가 잘못 되었습니다.
Const ERROR_GOPHER_INVALID_LOCATOR = (INTERNET_ERROR_BASE + 134)
' 로케이터 형식이 잘못 되었습니다.
Const ERROR_GOPHER_INCORRECT_LOCATOR_TYPE = (INTERNET_ERROR_BASE + 135)
' Gopher+ 가 아닙니다.
Const ERROR_GOPHER_NOT_GOPHER_PLUS = (INTERNET_ERROR_BASE + 136)
' 속성을 찾을 수 없습니다.
Const ERROR_GOPHER_ATTRIBUTE_NOT_FOUND = (INTERNET_ERROR_BASE + 137)
' 로케이터를 알 수 없습니다.
Const ERROR_GOPHER_UNKNOWN_LOCATOR = (INTERNET_ERROR_BASE + 138)

' ***** HTTP 오류 상수 *****
' 헤더가 존재하지 않습니다.
Const ERROR_HTTP_HEADER_NOT_FOUND = (INTERNET_ERROR_BASE + 150)
' 서버가 다운 된 것 같습니다.
Const ERROR_HTTP_DOWNLEVEL_SERVER = (INTERNET_ERROR_BASE + 151)
' 서버 응답이 잘못 되었습니다.
Const ERROR_HTTP_INVALID_SERVER_RESPONSE = (INTERNET_ERROR_BASE + 152)
' 헤더가 잘못 되었습니다.
Const ERROR_HTTP_INVALID_HEADER = (INTERNET_ERROR_BASE + 153)
' 요청의 조회가 잘못 되었습니다.
Const ERROR_HTTP_INVALID_QUERY_REQUEST = (INTERNET_ERROR_BASE + 154)
' 헤더가 이미 존재합니다.
Const ERROR_HTTP_HEADER_ALREADY_EXISTS = (INTERNET_ERROR_BASE + 155)
' 재연결에 실패 하였습니다.
Const ERROR_HTTP_REDIRECT_FAILED = (INTERNET_ERROR_BASE + 156)
' 재연결 되지 않았습니다.
Const ERROR_HTTP_NOT_REDIRECTED = (INTERNET_ERROR_BASE + 160)
' 쿠키 확인이 필요합니다.
Const ERROR_HTTP_COOKIE_NEEDS_CONFIRMATION = (INTERNET_ERROR_BASE + 161)
' 쿠기가 거부 되었습니다.
Const ERROR_HTTP_COOKIE_DECLINED = (INTERNET_ERROR_BASE + 162)
' 재연결 확인이 필요합니다.
Const ERROR_HTTP_REDIRECT_NEEDS_CONFIRMATION = (INTERNET_ERROR_BASE + 168)

' ***** 추가 인터넷 오류 상수 *****
' 보안 채널에 오류가 발생 하였습니다.
Const ERROR_INTERNET_SECURITY_CHANNEL_ERROR = (INTERNET_ERROR_BASE + 157)
' 캐쉬 파일을 사용할 수 없습니다.
Const ERROR_INTERNET_UNABLE_TO_CACHE_FILE = (INTERNET_ERROR_BASE + 158)
' TCP/IP가 설치되지 않았습니다.
Const ERROR_INTERNET_TCPIP_NOT_INSTALLED = (INTERNET_ERROR_BASE + 159)
' 연결이 끊겼습니다.
Const ERROR_INTERNET_DISCONNECTED = (INTERNET_ERROR_BASE + 163)
' 데이터가 서버에 도달할 수 없습니다.
Const ERROR_INTERNET_SERVER_UNREACHABLE = (INTERNET_ERROR_BASE + 164)
' 데이터가 프록시 서버에 도달할 수 없습니다.
Const ERROR_INTERNET_PROXY_SERVER_UNREACHABLE = (INTERNET_ERROR_BASE + 165)
' 프록시 자동 구성 스크립트가 잘못 되었습니다.
Const ERROR_INTERNET_BAD_AUTO_PROXY_SCRIPT = (INTERNET_ERROR_BASE + 166)
' 내려받기 스크립트를 사용할 수 없습니다.
Const ERROR_INTERNET_UNABLE_TO_DOWNLOAD_SCRIPT = (INTERNET_ERROR_BASE + 167)
' 인증서가 잘못 되었습니다.
Const ERROR_INTERNET_SEC_INVALID_CERT = (INTERNET_ERROR_BASE + 169)
' 인증서가 만기 되었습니다.
Const ERROR_INTERNET_SEC_CERT_REVOKED = (INTERNET_ERROR_BASE + 170)

' 보안 만기일 검사에 실패 하였습니다.
Const ERROR_INTERNET_FAILED_DUETOSECURITYCHECK = (INTERNET_ERROR_BASE + 171)
' 가장 마지막 오류
Const INTERNET_ERROR_LAST = ERROR_INTERNET_FAILED_DUETOSECURITYCHECK

' 공통 열기 상수 (InternetOpen 함수에 쓰이는 것이 아닙니다):
' 새로 고칩니다.
Const INTERNET_FLAG_RELOAD = &H80000000

' ***** InternetOpenUrl의 상수 *****
' 전체 데이터를 엽니다.
Const INTERNET_FLAG_RAW_DATA = &H40000000
' 이미 연결이 존재합니다.
Const INTERNET_FLAG_EXISTING_CONNECT = &H20000000

' ***** InternetOpen의 상수 *****
' 동기화 합니다.
Const INTERNET_FLAG_ASYNC = &H10000000

' *** FTP 프로토콜의 상수 ***
' Passive 모드를 사용합니다.
Const INTERNET_FLAG_PASSIVE = &H8000000

' ***** 추가적인 캐쉬 상수 *****
' 캐쉬에 쓰지 않습니다.
Const INTERNET_FLAG_NO_CACHE_WRITE = &H4000000
' 캐쉬 하지 않습니다.
Const INTERNET_FLAG_DONT_CACHE = INTERNET_FLAG_NO_CACHE_WRITE
' 권한을 만듭니다.
Const INTERNET_FLAG_MAKE_PERSISTENT = &H2000000
' 캐쉬로부터 읽습니다.
Const INTERNET_FLAG_FROM_CACHE = &H1000000
' 오프라인 파일로부터 읽습니다.
Const INTERNET_FLAG_OFFLINE = INTERNET_FLAG_FROM_CACHE

' ***** 추가적인 플래그 *****
' 보안 연결을 사용합니다.
Const INTERNET_FLAG_SECURE = &H800000
' 연결을 유지하도록 합니다.
Const INTERNET_FLAG_KEEP_CONNECTION = &H400000
' 자동으로 재연결하지 않습니다.
Const INTERNET_FLAG_NO_AUTO_REDIRECT = &H200000
' 읽기 전에 미리 읽습니다.
Const INTERNET_FLAG_READ_PREFETCH = &H100000
' 쿠키를 사용하지 않습니다.
Const INTERNET_FLAG_NO_COOKIES = &H80000
' 인증을 사용하지 않습니다.
Const INTERNET_FLAG_NO_AUTH = &H40000
' 인터넷에서 자료를 가져올 수 없을 때 캐쉬에서 읽습니다.
Const INTERNET_FLAG_CACHE_IF_NET_FAIL = &H10000

' 보안 무시 상수, HttpOpenRequest 에서 파생된
' 다음 형식의 보안 채널(SSL/PCT)을 무시합니다.
' HTTP로 재연결 하는 것을 무시합니다.
Const INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP = &H8000
' HTTPS로 재연결 하는 것을 무시합니다.
Const INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS = &H4000
' 인증서 기한이 만료됨을 무시합니다.
Const INTERNET_FLAG_IGNORE_CERT_DATE_INVALID = &H2000
' 인증서가 잘못됨을 무시합니다.
Const INTERNET_FLAG_IGNORE_CERT_CN_INVALID = &H1000

' ***** 그 밖에 캐쉬 상수 *****
' 다시 동기화 합니다: 캐쉬를 최신 내용으로 고칩니다.
Const INTERNET_FLAG_RESYNCHRONIZE = &H800
' 하이퍼링크를 사용합니다.
Const INTERNET_FLAG_HYPERLINK = &H400
' UI를 사용하지 않습니다.
Const INTERNET_FLAG_NO_UI = &H200
' 프라그마 부가 정보의 캐쉬를 사용하지 않습니다.
Const INTERNET_FLAG_PRAGMA_NOCACHE = &H100
' 비동기 캐쉬를 사용합니다.
Const INTERNET_FLAG_CACHE_ASYNC = &H80
' 폼을 전송합니다.
Const INTERNET_FLAG_FORMS_SUBMIT = &H40
' 파일이 필요합니다.
Const INTERNET_FLAG_NEED_FILE = &H10
' 캐쉬를 요청해야 합니다.
Const INTERNET_FLAG_MUST_CACHE_REQUEST = INTERNET_FLAG_NEED_FILE

' *** FTP 상수 ***
' 아스키 모드로 전송합니다: 텍스트 파일을 전송할 때
Const INTERNET_FLAG_TRANSFER_ASCII = &H1
' 바이너리 모드로 전송합니다: 이진 데이터를 가진 일반적인 파일을 전송할 때
Const INTERNET_FLAG_TRANSFER_BINARY = &H2

' 보안 마스크
Const INTERNET_SECURITY_MASK = INTERNET_FLAG_IGNORE_CERT_CN_INVALID Or INTERNET_FLAG_IGNORE_CERT_DATE_INVALID Or INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS Or INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP
' 인터넷 마스크
Const INTERNET_FLAGS_MASK = INTERNET_FLAG_RELOAD Or INTERNET_FLAG_RAW_DATA Or INTERNET_FLAG_EXISTING_CONNECT Or INTERNET_FLAG_ASYNC Or INTERNET_FLAG_PASSIVE Or INTERNET_FLAG_NO_CACHE_WRITE Or INTERNET_FLAG_MAKE_PERSISTENT Or INTERNET_FLAG_FROM_CACHE Or INTERNET_FLAG_SECURE Or INTERNET_FLAG_KEEP_CONNECTION Or INTERNET_FLAG_NO_AUTO_REDIRECT Or INTERNET_FLAG_READ_PREFETCH Or INTERNET_FLAG_NO_COOKIES Or INTERNET_FLAG_NO_AUTH Or INTERNET_FLAG_CACHE_IF_NET_FAIL Or SECURITY_INTERNET_MASK Or INTERNET_FLAG_RESYNCHRONIZE Or INTERNET_FLAG_HYPERLINK Or INTERNET_FLAG_NO_UI Or INTERNET_FLAG_PRAGMA_NOCACHE Or INTERNET_FLAG_CACHE_ASYNC Or INTERNET_FLAG_FORMS_SUBMIT Or INTERNET_FLAG_NEED_FILE Or INTERNET_FLAG_TRANSFER_BINARY Or INTERNET_FLAG_TRANSFER_ASCII
' CD-ROM을 넣어야 하는 오류 마스크
Const INTERNET_ERROR_MASK_INSERT_CDROM = &H1
' 설정 마스크
Const INTERNET_OPTIONS_MASK = (Not INTERNET_FLAGS_MASK)

' ***** API 공통 상수 (새 API) *****
' 동기화 하지 않습니다.
Const WININET_API_FLAG_ASYNC = &H1
' 동기화 합니다.
Const WININET_API_FLAG_SYNC = &H4
' 컨텍스트를 사용합니다.
Const WININET_API_FLAG_USE_CONTEXT = &H8

' INTERNET_NO_CALLBACK - 이 값을 dwContext 매개 변수에 넣으면
' API는 콜백 함수를 만들지 않습니다.
Const INTERNET_NO_CALLBACK = 0

' FTP 파일 구조체
' 파일 이름과 디렉토리인지 여부를 알려 준다.
Type tFtpFile
    filename As String
    isDirectory As Boolean
End Type

' FTP 전송 형식 상수: 아스키 모드, 바이너리 모드
Enum eFtpTransferType
    FTP_TRANSFER_TYPE_ASCII = &H1
    FTP_TRANSFER_TYPE_BINARY = &H0
End Enum

' ***** 유틸리티 함수 *****

fileInfo As tFtpFile

Function MMgetDirectory(hostname As String, directory As String, ByRef fileInfo() As tFtpFile, ByRef fileCount As Integer, Optional searchPattern As String = "*", Optional username As String = "UMMC", Optional password As String = "ummc") As Boolean
   Dim hInternet As Long
   Dim hFTP As Long
   Dim hFind As Long
   Dim findfile As WIN32_FIND_DATA
   Dim flags As Long
   Dim content As Long
   Dim Count As Integer
   Dim ret As Long
   Dim startingPoint As Integer
   Dim startingPoint2 As Integer
   ReDim fileInfo(1 To 1024)
   hInternet = InternetOpen(App.Title, 0, "", "", 0)
   hFTP = InternetConnect(hInternet, hostname, INTERNET_DEFAULT_FTP_PORT, username, password, INTERNET_SERVICE_FTP, 0, 0)
   Call FtpSetCurrentDirectory(hFTP, directory)
   hFind = FtpFindFirstFile(hFTP, searchPattern, findfile, flags, content)


   If hFind = 0 Then
       ReDim fileInfo(0 To 0)
       MMgetDirectory = False
       fileCount = 0
       Exit Function
   End If
   Count = 1
   fileInfo(Count).filename = Trim(Mid(findfile.cFileName, 1, InStr(1, findfile.cFileName, Chr(0), vbTextCompare) - 1))


   If findfile.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY Then
       fileInfo(Count).isDirectory = True
   Else
       fileInfo(Count).isDirectory = False
   End If
   ret = 1


   Do While ret <> 0
       ret = InternetFindNextFile(hFind, findfile)


       If ret <> 0 Then
           Count = Count + 1
           fileInfo(Count).filename = Trim(Mid(findfile.cFileName, 1, InStr(1, findfile.cFileName, Chr(0), vbTextCompare) - 1))


           If findfile.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY Then
               fileInfo(Count).isDirectory = True
           Else
               fileInfo(Count).isDirectory = False
           End If
       End If
   Loop
   fileCount = Count
   Call InternetCloseHandle(hInternet)
   MMgetDirectory = True
End Function


Function MMgetFtpFile(hostname As String, username As String, UserPassword As String, HostFilename As String, localFilename As String, Optional DeleteHost As Boolean = False, Optional TransferMode As eFtpTransferType = FTP_TRANSFER_TYPE_ASCII) As Long
   Dim hInternet As Long
   Dim hFTP As Long
   Dim DeleteSuccess As Boolean
   hInternet = InternetOpen(App.Title, 0, "", "", 0)
   hFTP = InternetConnect(hInternet, hostname, INTERNET_DEFAULT_FTP_PORT, username, UserPassword, INTERNET_SERVICE_FTP, 0, 0)
   MMgetFtpFile = FtpGetFile(hFTP, HostFilename, localFilename, False, 0, INTERNET_FLAG_DONT_CACHE + TransferMode, 0)


   If DeleteHost = True Then
       DeleteSuccess = FtpDeleteFile(hFTP, HostFilename)
   End If
   Call InternetCloseHandle(hInternet)
End Function


Function MMputFtpFile(hostname As String, username As String, UserPassword As String, HostFilename As String, localFilename As String, Optional TransferMode As eFtpTransferType = FTP_TRANSFER_TYPE_ASCII) As Long
   Dim hInternet As Long
   Dim hFTP As Long
   hInternet = InternetOpen(App.Title, 0, "", "", 0)
   hFTP = InternetConnect(hInternet, hostname, INTERNET_DEFAULT_FTP_PORT, username, UserPassword, INTERNET_SERVICE_FTP, 0, 0)
   MMputFtpFile = FtpPutFile(hFTP, localFilename, HostFilename, INTERNET_FLAG_DONT_CACHE + TransferMode, 0)
   Call InternetCloseHandle(hInternet)
End Function


Function MMdeleteFtpFile(hostname As String, username As String, UserPassword As String, HostFilename As String) As Boolean
   Dim hInternet As Long
   Dim hFTP As Long
   hInternet = InternetOpen(App.Title, 0, "", "", 0)
   hFTP = InternetConnect(hInternet, hostname, INTERNET_DEFAULT_FTP_PORT, username, UserPassword, INTERNET_SERVICE_FTP, 0, 0)
   MMdeleteFtpFile = FtpDeleteFile(hFTP, HostFilename)
   Call InternetCloseHandle(hInternet)
End Function


Function MMtouchFtpFile(hostname As String, username As String, UserPassword As String, HostFilename As String) As Boolean
   Dim localFilename As String
   localFilename = "C:\Touchfile.txt"
   Open localFilename For Output As #1
   Print #1, ""
   Close #1


   If PutFtpFile(hostname, username, UserPassword, HostFilename, localFilename, FTP_TRANSFER_TYPE_ASCII) = 1 Then
       MMtouchFtpFile = True
   Else
       MMtouchFtpFile = False
   End If
   Kill localFilename
End Function

출처 : http://blog.naver.com/lovzip/20028970496

'프로그램언어 > VB' 카테고리의 다른 글

ToolTip Class  (0) 2008.03.25
Http의 파일을 다운받는 cHTTPFile Class  (0) 2008.03.25
INI(설정)파일 Read & Write 모듈  (0) 2008.03.25
Registry Read & Write 샘플 프로젝트 소스  (1) 2008.03.25
OS 언어 확인  (0) 2008.03.24
728x90
툴팁을 보다 쉽게 만들고 사용하기위한 클래스입니다.  (어디에 올릴지 몰라서 그냥 자료실에 올립니다.^^)

VB와 VBA에서 모두 사용가능하고, XP와 Vista에서만 테스트를 했습니다.  아마도 다른 버전이라도 별 문제는 없을 듯 합니다.  툴팁을 생성할때 핸들이 필요하므로, VBA에서는 프레임과 리스트박스와 같은 [_GethWnd]메서드가 사용가능한 것만 쉽게 쓸수 있습니다.(물론 노가다를 한다면.. 다 되겠지만..^^;;) 그리고 VB에서는 무난하게 사용할수 있을듯,, 그런데 만들고 보니,  괜히 만든것 같다는. ㅡㅡ;;  


 파일을 열어보시면, 폼과 클래스모듈파일이 있는데, 폼은 cToolTip.cls파일을 사용한 예제이므로 그냥 참고만 하고, cToolTip.cls파일만 필요한데다가 넣으면 됩니다.  


  +첨부한 파일안에 RES라는 폴더가 있습니다. 이 폴더에는 RES파일을 넣었습니다.  RC파일과 리소스들도 있습니다.  Create_RES_File 배치파일을 실행시키면 VB의 Resource Compiler를 사용해서 RES파일이 생성됩니다. 그리고 첨부한 RES파일과 manifest파일은 깨끗한(아무 설명도 없는) 파일으므로 그냥 쓰셔도 무방합니다. (보통은 주석을 자기 이름을 달아놔서 ㅡㅡ;; 그냥 쓰기 난감함;;)


이 프로그램(cToolTip.cls)에 문제가 있으면 말씀해주시면 감사하겠습니다^^


그럼 좋은 하루되세요^^


아래 이미지는 Windows Vista에서 테스트하는 모습입니다.

'프로그램언어 > VB' 카테고리의 다른 글

WININET API 선언문  (0) 2008.04.24
Http의 파일을 다운받는 cHTTPFile Class  (0) 2008.03.25
INI(설정)파일 Read & Write 모듈  (0) 2008.03.25
Registry Read & Write 샘플 프로젝트 소스  (1) 2008.03.25
OS 언어 확인  (0) 2008.03.24

+ Recent posts