초기 이미지는 다음과 같습니다. URL 텍스트 박스에 URL을 입력하고 엔터를 입력하면, 그 URL에 대한 응답 결과를 표시합니다.


아래 이미지는 텍스트 박스 처럼 입력한 URL에 대한 응답 결과 입니다.


소스입니다.
Option Explicit

Private 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
Private Declare Function InternetOpenUrl Lib "wininet.dll" Alias "InternetOpenUrlA" (ByVal hInternetSession As Long, ByVal sURL As String, ByVal sHeaders As String, ByVal lHeadersLength As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As Long, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Boolean
Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
Private Const INTERNET_OPEN_TYPE_DIRECT = 1
Private Const INTERNET_FLAG_NO_CACHE_WRITE = &H4000000
Private Const BUFFER_LEN = 256

Private Function GetUrlSource(sURL As String) As String
    Dim lReturn As Long ' 읽은 데이타의 바이트 수
    Dim hSession As Long ' WinINet 핸들
    Dim hInternet As Long ' URL을 오픈한 핸들
    Dim iResult As Long  ' 결과
    Dim sBuffer ' 읽은 데이타가 저장되는 버퍼
   
    sBuffer = String(BUFFER_LEN, " ") ' 버퍼 영역 지정
    hSession = InternetOpen("vb wininet", INTERNET_OPEN_TYPE_DIRECT, vbNullString, vbNullString, 0) ' WinINet 핸들을 얻는다
    If hSession Then hInternet = InternetOpenUrl(hSession, sURL, vbNullString, 0, INTERNET_FLAG_NO_CACHE_WRITE, 0) ' URL을 오픈한다.
    If hInternet Then
        iResult = InternetReadFile(hInternet, StrPtr(sBuffer), BUFFER_LEN, lReturn)
        GetUrlSource = MidB(sBuffer, 1, lReturn)
        Do While lReturn <> 0
            iResult = InternetReadFile(hInternet, StrPtr(sBuffer), BUFFER_LEN, lReturn)
            GetUrlSource = GetUrlSource & MidB(sBuffer, 1, lReturn)
        Loop
    End If
    GetUrlSource = StrConv(GetUrlSource, vbUnicode)
    iResult = InternetCloseHandle(hInternet)
    iResult = InternetCloseHandle(hSession)
End Function

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    If Not KeyCode = vbKeyReturn Then Exit Sub
    Text2.Text = GetUrlSource(Text1.Text)
End Sub

여기 보시면 Private Declare Function InternetReadFile Lib "wininet.dll" (ByVal hFile As Long, ByVal sBuffer As Long, ByVal lNumBytesToRead As Long, lNumberOfBytesRead As Long) As Boolean 에서 버퍼를 String로 하지 않고 Long로 표시한 이유는 VB에서 API를 사용하는 경우 String 형을 사용하게 되면 호출시 String에 저장된 무자를 유니코드로 간주 ANSI코드로 변경하고,
반환시는 거꾸로 String 형을 ANSI코드로 간주하고 유니코드로 변경하게 됩니다.
 만약 2바이트가 하나의 문자가 되는 데이터가 잘려서 저장이 되었다면 이상한 문자로 변환될수도 있읍니다. 그러면 URL에서 응답한 내용과, 저장된 내용이 다를수가 있읍니다. 그래서 URL에서 응답한 내용을 그대로 보존하기 위해 Long을 사용했읍니다. 이때는
strptr 함수를 사용해서 버퍼 문자열의 주소를 넘겨 주면 됩니다.

나머지 내용에는 별다른 특별한 내용은 없습니다.

+ Recent posts