問題 有關 WinINet API 的問題。

  • 2012年4月24日 下午 03:50
     
      包含代碼

    Sub GetHTML()

    Local fSession, fConnect, fRequest As Dword Local zHost, zAgent As Asciiz * 512 Local sDocument As String zAgent = "PowerBASIC Agent." zHost = "sample.com"

    ' 第一次連接

    fSession = InternetOpen(zAgent, %INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, ByVal 0&, ByVal 0&, 0)

    fConnect = InternetConnect(fSession, zHost, %INTERNET_DEFAULT_HTTP_PORT, ByVal 0&, ByVal 0&, %INTERNET_SERVICE_HTTP, 0, 1) ' Request startup. fRequest = HttpOpenRequest(fConnect, "GET", "", ByVal 0&, "", "", %INTERNET_FLAG_NO_COOKIES, 0) '' Send request. HttpSendRequest(fRequest, ByVal 0&, 0, ByVal 0&, 0) '' Read document (via HttpGetDocument). sDocument = HttpGetDocument(fRequest) ' Finish request. HttpEndRequest(fRequest, ByVal 0&, 0, 0) ' Connection end. InternetCloseHandle(fRequest) InternetCloseHandle(fConnect) InternetCloseHandle(fSession)

    '第一次連接結束

    '第二次連接

    fSession = InternetOpen(zAgent, %INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, ByVal 0&, ByVal 0&, 0)

    fConnect = InternetConnect(fSession, zHost, %INTERNET_DEFAULT_HTTP_PORT, ByVal 0&, ByVal 0&, %INTERNET_SERVICE_HTTP, 0, 1) ' Request startup. fRequest = HttpOpenRequest(fConnect, "GET", "", ByVal 0&, "", "", %INTERNET_FLAG_NO_COOKIES, 0) '' Send request. HttpSendRequest(fRequest, ByVal 0&, 0, ByVal 0&, 0) '' Read document (via HttpGetDocument). sDocument = HttpGetDocument(fRequest) ' Finish request. HttpEndRequest(fRequest, ByVal 0&, 0, 0) ' Connection end. InternetCloseHandle(fRequest) InternetCloseHandle(fConnect) InternetCloseHandle(fSession)

    '第二次連接結束

    End Sub

    Function HttpGetDocument( ByVal hRequest As Long ) As String
        Local zBuffer As Asciiz * 4096
        Local sDocument As String
        Local dwBytesRead As Dword
        
        sDocument = ""
        Do
            If InternetReadFile(hRequest, VarPtr(zBuffer), 4096, dwBytesRead) Then
                If dwBytesRead > 0 Then
                    sDocument &= Peek$(VarPtr(zBuffer), dwBytesRead)
                End If
            Else
                Exit Do
            End If
        Loop While dwBytesRead > 0
        
        Function = sDocument
    End Function

    以上代碼是用 PowerBASIC 開發的,但我想問的主要關於 WinINet API 的問題,希望不違反這裡的規定。

    以上代碼會讀取相同的網頁 兩次

    但我遇到一個問題,當第一次連接後,使用 InternetCloseHandle 關閉連接(共執行三次),並發起第二次連接。

    但是第一次連接並沒有成功關閉,而 InternetCloseHandle 全部回傳 TRUE,以下是實際連接的情況。

    從圖中可見,第一次連接會發起 Connect 連接,但第二次卻直接使用了第一次的連接,使得當中的數據出現了錯亂。

    有什麼方法可以解決這問題,還是我的代碼中有錯誤的地方,希望指教,謝謝。



    • 已編輯 Ivan_962 2012年4月26日 下午 12:12
    • 已編輯 Ivan_962 2012年4月26日 下午 12:13
    •  

所有回覆

  • 2012年4月25日 下午 03:31
     
     

    你上方的原始碼貼了兩次?

    這個 VB6 的 sample 有用嗎?

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=12&Function=67


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

  • 2012年4月26日 下午 12:15
     
     

    我加了一點註解,原始碼會清楚一點。

    那個 SAMPLE 貌似也沒有解決第一個連接不會結束的問題。

    如果這是 WinINet API 的 Bug,我也只能放棄了。