Как сделать так, чтобы Internet Explorer открывался невидимо в VB6?

Делаем так:

Shell ("C:\Program Files\Internet Explorer\iexplore.exe -embedding http://www.websiteurl.com")

Не работает так, как мне нужно, поскольку мне по существу нужно, чтобы он мог перенаправить и предложить пользователю загрузить файл. Есть идеи?


person Community    schedule 26.10.2008    source источник
comment
По какой-то конкретной причине вам нужен IE для запроса пользователя? Почему бы просто не сделать свою собственную подсказку, а затем использовать свой собственный код для загрузки файла. HTTP-запросы (именно это и будет делать IE) довольно стандартны и в основном легко кодируются.   -  person Nicholas Flynt    schedule 26.10.2008


Ответы (6)


Internet Explorer предоставляет COM-совместимый интерфейс, который вы можете использовать. Если вам действительно нужно. Я бы не рекомендовал его - он сравнительно медленный, подверженный ошибкам, громоздкий и ресурсоемкий.

Что решает вашу проблему более элегантно, так это использование WinHTTPRequest. В своем проекте укажите «Службы Microsoft WinHTTP, версия 5.1», а затем выполните следующие действия:

Dim HttpRequest As New WinHttp.WinHttpRequest
Dim TargetUrl As String
Dim TargetFile As String
Dim FileNum As Integer

TargetFile = "C:\foo.doc"

TargetUrl = "http://www.websiteurl.com"
HttpRequest.Open Method:="GET", Url:=TargetUrl, Async:=False
HttpRequest.Send

If HttpRequest.Status = 302 Then

  TargetUrl = HttpRequest.GetResponseHeader("Location")
  HttpRequest.Open Method:="GET", Url:=TargetUrl, Async:=False
  HttpRequest.Send

  If HttpRequest.Status = "200" Then

    FileNum = FreeFile
    Open TargetFile For Binary As #FileNum
    Put #FileNum, 1, HttpRequest.ResponseBody
    Close FileNum 

    Debug.Print "Successfully witten " & TargetFile
  Else
    Debug.Print "Download failed. Received HTTP status: " & HttpRequest.Status
  End If
Else
  Debug.Print "Expected Redirect. Received HTTP status: " & HttpRequest.Status
End If

Жесткое кодирование "C:\foo.doc", конечно, не имеет особого смысла. Я бы использовал имя файла, которое сервер предоставляет в заголовках ответов ("Content-Type" или "Content-Disposition", в зависимости от того, что вы ожидаете).

person Tomalak    schedule 27.10.2008

Есть несколько вещей, которые вы могли бы сделать.

  • Используйте внешнюю программу, например wget, чтобы получить файл вместо IE. Вы можете получить wget бесплатно на http://www.cygwin.com с помощью инструментов cygnus. Это GPL, так что будьте осторожны, если у вас есть коммерческий продукт.

  • Напишите небольшую программу .NET, которая использует класс HttpWebRequest для получения файла и оболочки для этой программы вместо IE. Я не думаю, что вам повезет, если вы раскошелитесь на IE. Звучит как, перефразируя Стива Джобса, «мешок боли».

person Dave Markle    schedule 26.10.2008
comment
Просто казалось, что есть простой способ открыть ie и указать на ссылку, не становясь фактически видимым ie :( Думаю, нет. - person ; 26.10.2008

Если все, что вы пытаетесь сделать, это загрузить файл, вы можете использовать URLDownloadToFile. .

person Andru Luvisi    schedule 26.10.2008
comment
Это будет работать нормально, но я хотел, чтобы это попало в мою отдельную папку в моем домене, которая отслеживает, сколько раз мое приложение загружается. Таким образом, на первой странице есть счетчик, который срабатывает и перенаправляется на фактическое место загрузки. - person ; 26.10.2008
comment
Хм... в таком случае, использование чего-то вроде cURL (curl.haxx.se) может быть проще всего сделать. -o позволяет указать, где сохранить файл, а -L позволяет указать ему следовать перенаправлениям. - person Andru Luvisi; 26.10.2008
comment
Еще одна мысль - вы можете отслеживать, сколько раз он был загружен, используя журналы веб-сервера. - person Andru Luvisi; 26.10.2008

Интерфейс Internet Explorer доступен ActiveX через элемент управления WebBrowser (содержится в %systemroot%\system32\shlwapi.dll). Хотя это может быть не очень элегантно, вы можете легко разместить элемент управления где-нибудь вне видимой области формы.

Управление очень простое в использовании.

person smbarbour    schedule 26.10.2008

Лучше всего создать отдельное приложение для загрузки, используя какой-либо объект .NET http для загрузки файла. Я бы порекомендовал WebClient.

Если вам действительно нужно придерживаться VB6, я уверен, что вы можете использовать базовую работу с сокетами, чтобы загрузить файл напрямую.

person Community    schedule 27.10.2008

Другой вариант, помимо вызова API URLDownloadToFile, предложенный Glomek, заключается в следующем: используйте метод AsyncRead, встроенный в VB6.

person MarkJ    schedule 28.10.2008