有關 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 連接,但第二次卻直接使用了第一次的連接,使得當中的數據出現了錯亂。
有什麼方法可以解決這問題,還是我的代碼中有錯誤的地方,希望指教,謝謝。
所有回覆
-
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,我也只能放棄了。

