2012-11-23 3 views
2

최근에 URLDownloadToFile이 IE 프록시 설정을 사용함을 알았습니다. 그래서 대안을 찾고 있는데 WinHttp.WinHttpRequest가 작동 할 수도 있습니다.WinHttp.WinHttpRequest를 사용하여 검색 한 바이너리 데이터의 크기를 확인하십시오.

ResponseBody 속성에 가져온 데이터가 포함되어있어 파일에 기록해야합니다. 문제는 내가 그것의 바이트 크기를 찾을 수 없다는 것입니다.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa384106%28v=vs.85%29.aspx에는 개체에 대한 정보가 있지만 관련 속성을 찾을 수 없습니다.

누군가가 어떻게 알 수 있습니까?

strURL := "http://www.mozilla.org/media/img/sandstone/buttons/firefox-large.png" 
strFilePath := A_ScriptDir "\dl.jpg" 

pwhr := ComObjCreate("WinHttp.WinHttpRequest.5.1") 
pwhr.Open("GET", strURL) 
pwhr.Send() 

if (psfa := pwhr.ResponseBody) { 
    oFile := FileOpen(strFilePath, "w") 
    ; msgbox % ComObjType(psfa) ; 8209 
    oFile.RawWrite(psfa, strLen(psfa)) ; not working 
    oFile.Close() 
} 

답변

2

혼자서 길을 찾았습니다.

psfa은 바이트 배열이므로 요소 수는 단순히 크기를 나타냅니다.

msgbox % psfa.maxindex() + 1 ; 17223 bytes for the example file. A COM array is zero-based so it needs to add one. 

그러나 safearray에 저장된 이진 데이터를 저장하려면 파일 개체를 사용하지 못했습니다. (방법이 있을지 모르지만 찾을 수는 없습니다.) 대신 ADODB.Stream은 매력처럼 작동했습니다.

strURL := "http://www.mozilla.org/media/img/sandstone/buttons/firefox-large.png" 
strFilePath := A_ScriptDir "\dl.png" 
bOverWrite := true 

pwhr := ComObjCreate("WinHttp.WinHttpRequest.5.1") 
pwhr.Open("GET", strURL) 
pwhr.Send() 

if (psfa := pwhr.ResponseBody) { 
    pstm := ComObjCreate("ADODB.Stream") 
    pstm.Type() := 1  ; 1: binary 2: text 
    pstm.Open() 
    pstm.Write(psfa) 
    pstm.SaveToFile(strFilePath, bOverWrite ? 2 : 1) 
    pstm.Close()  
}