'글목록 전체보기'에 해당되는 글 12941건

  1. 주민등록번호를 대체할 아이핀(ipin) 무료 발급받는 사이트 안내와 사용방법 2
  2. 게이샤 - 은평구 신사동의 일본식 주점 방문기
  3. Elvis Costello - She (영화 노팅힐 Notting Hill OST) 음악 듣기
  4. 영화 페인티드 베일 (The Painted Veil) vs 서머셋 모옴의 소설 인생의 베일 리뷰 2
  5. mbc 지붕뚫고 하이킥 유인나의 일본진출 vs 노팅힐 기자회견 장면 비교
  6. SBS 뉴스추적 - 아파트 관리비, 눈 먼 돈인가?
  7. wIniNet API - FTP Upload, Download를 위한 VB Script

주민등록번호를 대체할 아이핀(ipin) 무료 발급받는 사이트 안내와 사용방법

 
반응형







주민등록번호로 가입을 하는대신 최근에 아이핀을 가지고 회원 등록을 하는 사이트들이 늘어나고 있는데,
저도 아이핀이 하나 필요해서 무료 아이핀을 발급받아 보았습니다.

무료발급을 위해서는 아래의 링크를 클릭하시면 됩니다.

무료아이핀발급받기

새로 이동된 페이지에서 아이핀 발급받기를 누르면 아래와 같은 팝업창이 뜹니다.


약관 동의를 클릭하고, 성명, 주민번호, id, 비밀번호, 이메일주소를 입력하면 됩니다.


그러면 신원확인을 하는곳이 나오는데, 휴대폰, 신용카드, 범용공인인증서 등으로 인증이 가능합니다.
대면확인은 뭔가 하고 눌러봤는데 안되네요...^^
그리고 공인인증서는 은행용 무료인증서로는 확인이 안됩니다.


그리고 나면 위처럼 코리아크레딧뷰로 발급기관이 정해지고, 아이핀 ID가 생성이 됩니다.

아이핀 관리하기

위 사이트에 가서 관리도 가능합니다.
한마디로 아이핀 ID를 만들면 인증된 해당업체에서 주민등록번호, 비밀번호, 이메일주소를 관리하므로,
내가 새로 가입하려고하는 사이트에 주민번호를 따로 제출을 안하게 관리를 해준다고 보면 될듯 합니다.
많이 활성화를 시킨다고는 했는데, 아직까지는 많이 적용되지는 않지만,
자신이 자주 사용하는 ID를 선점하기 위해서라도 하나쯤 만들어두시면 좋지 않을까 싶습니다.

무료아이핀발급받기










아이핀 소개보기
반응형

게이샤 - 은평구 신사동의 일본식 주점 방문기

 
반응형

생긴지는 꽤 되었는데, 밖에서 볼때는 일반주점보다는 고급일식집 같은느낌에 한번도 안가다가 처음으로 가본 술집...
원래는 호프집이다가 돼지부속구이 집으로 바뀌었다가, 삼겹살집으로 바뀌었다가 이집으로 바뀌었다는...



철판요리, 간단한 안주, 꼬치 구이류 등의 메뉴...


튀김류, 탕류, 샐러드...


간단한 회, 사시미류... 게이샤 정식 등...


스시 식사류 등등...
체인점은 아닌듯한데, 메뉴가 엄청나게 많다...-_-;;


소주부터 맥주, 정종, 일본사케, 수입맥주, 도쿠리 등등...


주방... 바에 앉아서 먹는 사람도 있고, 가족들이 와서 돈까스를 먹기도...


우리가 시킨 17000원짜리 참치뱃살...
양으로 보나 맛으로 보나 급실망...
물론 일반주점에서 파는 냉동참치보다는 훨났기야 하지만, 양으로나 맛으로나 가격대비에 실망...
참치회라기보다는 광어나 우럭처럼 너무 얇고, 해동도 영 아니다...



서비스로 나온 계란후라이
같이 간 형은 안주중에 이게 제일 괜찮다고...-_-;;


이건 6천원짜리 계란탕인데, 싱거운데다가 고추만 무진장 들어가 있다...


6천원짜리 계란탕

실내인테리어는 깔끔하고, 이쁘게 잘되있고, 옆자리 분들은 홍합탕과 튀김을 맛있게 드시고, 뒤의 아이들은 돈까스를 맛있게 먹는데, 어째 우리가 시킨거는 이런다냐...-_-;;









옆 사람들은 잘먹는데, 어째 우리가 뽑기를 잘못한것인지... 꽤 실망을...
다시 갈지 어떨지는 모르겠지만, 참치회나 계란탕은 먹지 말아야 겠다...

위치는 응암역 6호선 근방이고, 신사동사무소 건너편집



 
반응형

Elvis Costello - She (영화 노팅힐 Notting Hill OST) 음악 듣기

 
반응형


지붕뚫고 하이킥 유인나의 일본진출 vs 노팅힐 기자회견 장면

위 방송에서 노팅힐의 기자회견장면을 패러디해서 오래간만에 다시 찾아본 영화... 다시봐도 멋지고 감동적이다...
줄리아 로버츠와 휴그랜트의 환한 미소가 참 기억에 남는다....


영화에서는 시작부분에 한번 나오고, 엔딩부분에 또 다시 한번 나오는 음악인데, 물론 시작부분보다는 엔딩부분의 음악이 같은 음악임에도 불구하고, 더욱 진한 감동이 느껴지는데... mp3를 자주 듣고는 하지만, 이렇게 직접 가사 해석을 한것을 찾아보니 또 다른 느낌으로 다가온다는...

She may be the face I can`t forget
그녀는 아마도 내가 잊을 수 없는 얼굴
The trace of pleasure or regret
기쁨 또는 후회의 흔적은
May be my treasure or the price I have to pay
어쩌면 나의 보물이거나 내가 치러야 할 대가일지도 몰라요
She may be the song that summer sings
그녀는 아마도 여름이 불러주는 노래
May be the chill that autumn brings
어쩌면 가을이 주는 서늘함
May be a hundred different things Within the measure of a day
어쩌면 하루에도 수백가지로 변하는
다른 모습들일지도 모르죠


She may be the beauty or the beast
그녀는 아마도 미녀이거나 야수
May be the famine or the feast
빈곤이거나, 혹은 풍성함일수도 있고
May turn each day in to a heaven or a hell
하루하루를 천국 혹은 지옥으로 바꿀지도 모르죠
She may be the mirror of my dreams
그녀는 아마도 내 꿈을 비추는 거울
Her smile reflected in a stream
시냇물에 비치는 그녀의 미소
She may not be what she would seem Inside her shell
그녀 속에 감춰진 모습은 어쩌면 겉과 다를지도 모르죠



She would always seem so happy ln a crowd
그녀는 많은 사람들 안에서 항상 행복해 보일거에요
Whose eyes can be so bright and so proud
누구의 눈이 그렇게 밝고 자랑스럽게 빛날까
No one`s allowed to see them when they cry
슬피 울때는 아무에게도 보이지 않아요



She may be the love that cannot hope to last
그녀는 아마도 영원히 계속되길 바랄 수 없는 사랑
May come to me from shadows of the past
과거의 그림자에서 찾아온 힘들때가 오더라도
But I`ll remember `til the day I die
죽는날까지 난 그녀를 기억하겠어요
She may be the reason I survive
그 녀는 아마도 내가 살아있는 이유
The why and where for I`m alive
그녀가 있기때문에 내가 있고
The one I`ll care for
그 이유로 난 힘을 얻죠
through the rough and ready years
거칠고 긴 세월 동안
Me, I`ll take her laughter and her tears
난, 그녀의 웃음과 눈물로서
And make them all my souvenirs
나의 추억의 선물로 간직할 거에요
The way she goes that, got to be
그녀가 가는곳에 나도 가리니
The meaning of my life is she
내 삶의 의미는 그녀이죠

She, she,she
그녀, 진정 그녀이죠

 
반응형

영화 페인티드 베일 (The Painted Veil) vs 서머셋 모옴의 소설 인생의 베일 리뷰

 
반응형
좀 개념없는 여자가 부모곁을 떠나기위해서 사랑없이 무뚝뚝한 남자와 결혼을 한다. 그녀는 바람둥이와 바람을 피우다가 걸리게 되는데, 이혼과 중국오지로 떠나는 둘중의 하나의 선택에 어쩔수없이 중국으로 떠나게 되지만, 서로간에 철저하게 무시하며 살아가는데...
라는  줄거리의 영화로... 서머셋몸의 원작 소설 인생의 베일을 영화로 리메이크를 한 작품으로, 영화로는 벌써 3번째로 만들어졌다고

영화자체는 좀 지루한면도 없지는 않지만, 남녀간의 심리묘사나 그들의 마음을 너무나도 잘 표현한 대사들... 과연 부부라는것의 굴레는 무엇이고, 권리와 의무는 무엇일까라...
과연 사랑과 인생의 베일은 무엇일까에 대해서 진지한 질문을 던지는 작품이라고 할까...

결혼은 한 상태이지만 철저하게 외면하고 무시하면서 살아가다가 편안하고, 솔직한 대화를 통해서 자신들이 얼마나 부질없는 짓들을 해왔는지에 대한 장면과 원장 수녀님이 키티에게 하나님과 자신의 관계를 통해서 관계의 권리와 의무 등를 말씀해주시는 장면이 정말 인상적이였다.

자신을 좋아하지도, 현명하지도 않은 여자를 사랑하는 남자와 그런 남자의 희망과 기대를 철저히 배신하고, 남의 아이까지 가진 여자...
과연 그 여자를 다시 사랑할수 있을까?
영화를 보기 전까지는 그런 여자를 절대 용서할수 없을것이라고 믿었는데, 영화를 보다보니 또 그러한 상황이 조금은 이해가 가기도 한다.. 어찌보면 그러한 결과 또한 모두 여자의 잘못이라고 돌을 던질수는 없으니...

원작 소설은 키티를 중심으로한  성장과 삶을 다룬 책이였다면, 영화는 월터의 역활 비중이 커지고, 키티와의 결말도 많이 다르게 끝이 난다고...


인생의 베일
카테고리 소설
지은이 서머셋 모옴 (민음사, 2007년)
상세보기

페인티드 베일
감독 존 커란 (2006 / 미국)
출연 나오미 왓츠, 에드워드 노튼, 리브 슈라이버, 다이아나 리그
상세보기

개봉 2007년 03월 14일 

감독 존 커란
출연 에드워드 노튼 , 나오미 왓츠 , 리브 슈라이버 , 조 텔포드 , 다이아나 리그 , 샐리 호킨스
상영시간 124분
관람등급 15세 이상 관람가  
장르 로맨스 
제작국가 중국, 미국
제작년도 2006년
홈페이지 http://www.paintedveil.co.kr  

너무나 늦게 서로에 대한 사랑을 확인한 두 사람…
운명은 그들을 기다려 주지 않는다…

 
반응형

mbc 지붕뚫고 하이킥 유인나의 일본진출 vs 노팅힐 기자회견 장면 비교

 
반응형

스키니그룹 데뷔로 인해서 광수의 생일도 제대로 못챙겨주고, 일본진출을 하게된 인나...
마지막으로 인나의 모습을 지켜보고 싶어서 몰래 찾은 기자회견장에서 머리를 끍다가 얼떨결에 기자회견에 참석하게되어서 인나의 파이팅과 선전을 말한다...



이에 인나는 자신이 가장 사랑하는 친구가 있는데, 생일을 못챙겨줘서 미안하고, 일본에 갔다와서 바로 연락을 하고, 전화를 주겠다고...


근데 어디서 많이 본듯한 장면...

줄리아로버츠와 휴그랜트 주연의 노팅힐의 막판 명장면인 기자회견장에서의 일을 그대로 가지고 온듯...

휴그렌트에게 차인 헐리우드스타인 줄리아로버츠가 언제 떠나냐는 기자의 질문에 오늘 저녁에 미국으로 간다고...

그때 자신이 한짓을 후회를 하고 찾아와 기자회견장에서 만약 그 사람이 무릎을 꿇고 빈다면 다시 받아줄 의향이 있냐고...


당연히 받아준다고 하고는... 아까 언제 떠나냐는 기자에게 다시 질문을 해달라고 해서는...
영국을 떠나지 않을꺼라고 하며 환하게 웃는 줄리아로버츠...





정말 환상적이고 행복해 보이는 미소들...
나도 저렇게 웃고 싶다...^^

암튼 노팅힐을 표절했다기 보다는, 패러디를 한 정도로 보면 좋을듯...
반응형

SBS 뉴스추적 - 아파트 관리비, 눈 먼 돈인가?

 
반응형

아파트 관리비때문에 말이 많은곳이 한두군데가 아니고, 뉴스에서도 심심치않게 기사가 나오는데, 동대표의 전횡을 중점적으로 다룬 방송으로, 말도안되는 재무제표에 각종 공사시에 받는 리베이트 등 거의 직업적으로 동대표를 맡고 있는 사람들...
방송을 보니 거의 완장을 차고 전횡을 휘두르면서 엄청난 뒷돈을 받고, 챙기고, 관리규약을 입맛대로 바꾸고, 관리소장이나 경비들을 가지고 권력을 휘두르는 모습이 어이가 없을뿐이였다.
1998년에 대대적으로 아파트 관련 비리를 일제 단속을 해서 많이 좋아지는듯 하다가 다시 이러한 상황이 벌어지고 있는데, 심한곳은 관리소장, 입주사대표, 위탁관리업체가 한통속이 되서 이런짓을 벌리기도 한다고...
물론 이런곳만 있는곳은 아니다. 한때는 동대표의 비리로 문제가 많다가 동대표를 퇴출시키고, 정직한 동대표가 투명하게 관리를 하는곳도 있는데, 역시나 중요한것은 사람인듯...

이러한것을 시정할수 있는것은 역시 정부나 지자체인데, 거의 손을 놓고 있어서 투명성도 없고, 전문성도 없는 사람들이 이러한 일들이 벌이고 있고, 동대표들이 챙긴 뒷돈은 바로 입주민에게서 나오는데, 우리나라의 정서상 자신이 사는 아파트를 집으로 생각하기 보다는, 투자의 대상으로 생각하는 사람들이 많기 때문에 관리를 하고, 관심을 가지는데 미흡한 부분도 많다고...

관리비 명세서를 봐도 정말 관심을 가지고 나서지 않는 이상 입주민이 바로잡기는 힘든 현실인데, 정답이라고 할수는 없겠지만, 정부와 구청과 같은 지자체가 나서서 관리비등의 규약을 제대로 정비하고, 투명성을 관리하는것외에는 동대표나 관리소의 양심에 맡기는 수밖에 없는것이 작금의 현실인것이 안타까울뿐이다.

뉴스추적 다시보기 홈페이지
불만제로 - 관리비 2탄, 프랜차이즈 세탁소의 실체
정부실패와 혈세(血稅)가 새는 이유... 타인의 돈을 타인이나 나를 위해 쓴다는 것


뉴스추적(546회) 방영일 : 2010-03-10

[실태고발] 아파트 관리비, 눈 먼 돈인가?
2010년 3월 10일 밤 11시 5분~


우리나라 인구의 2/3가 공동주택에 거주하고 있다. 3천만 명에 가까운 인구가 아파트에 살고 있다는 것이다. 그런데 아파트 단지의 절반 이상이 주민들 사이의 고소, 고발로 몸살을 앓고 있다고 한다. 그 이유는 아파트 관리비와 단지 내 공사에서의 비리, 횡령 사건 때문이다. 2010년 아파트에서는 과연 무슨 일이 벌어지고 있을까?
반응형

wIniNet API - FTP Upload, Download를 위한 VB Script

 
반응형
' ***** 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

->> ByVal lFlags 을 134217728 으로 하면, passive FTP mode 로 접속!

' 가장 마지막으로 연결했던 곳의 응답 내용을 알아옵니다.
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

 
반응형