Страница: 1 | 2 | 3 |
Вопрос: UrlDownloadToFile
Добавлено: 22.08.06 14:24
Автор вопроса: i0ngunn3r
Как сделать, чтобы во время закачки файла вся программа не зависала?
Использую функцию так:
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
Private Sub Command1_Click()
URLDownloadToFile 0, "http://somesite/someexe.exe", "c:\someexe.exe", 0, 0
End Sub
У меня что-то неверно?
Можно сделать так, чтобы вся прога не зависала? А еще лучше - если можно как-либо указать процентность закаченного файла. :)
Если можно, то как?)
Ответы
Всего ответов: 31
Номер ответа: 1
Автор ответа:
i0ngunn3r
Вопросов: 11
Ответов: 30
Профиль | | #1
Добавлено: 22.08.06 14:38
Извините, погуглил, нашел решение.
Номер ответа: 2
Автор ответа:
Softer
ICQ: 203660381
Вопросов: 29
Ответов: 205
Web-сайт:
Профиль | | #2
Добавлено: 22.08.06 15:17
И какое если не секрет?
Номер ответа: 3
Автор ответа:
Calhoon
ICQ: 789764
Вопросов: 90
Ответов: 230
Web-сайт:
Профиль | | #3
Добавлено: 22.08.06 15:25
Погугли, найдешь
Номер ответа: 4
Автор ответа:
Softer
ICQ: 203660381
Вопросов: 29
Ответов: 205
Web-сайт:
Профиль | | #4
Добавлено: 22.08.06 15:30
Ок... На что гуглить?
Номер ответа: 5
Автор ответа:
i0ngunn3r
Вопросов: 11
Ответов: 30
Профиль | | #5
Добавлено: 22.08.06 15:41
Можно даже не гуглить, а яндексить.
http://pda.yandex.ru/search?query=%D0%B7%D0%B0%D0%B2%D0%B8%D1%81%D0%B0%D0%B5%D1%82+urldownloadtofile
Вторая страница с похожей темой. Там же - как минимум два способа. Я через Winsock использую, правда теперь появилась куча проблем..
Номер ответа: 6
Автор ответа:
Softer
ICQ: 203660381
Вопросов: 29
Ответов: 205
Web-сайт:
Профиль | | #6
Добавлено: 22.08.06 15:42
Пасиб!
Номер ответа: 7
Автор ответа:
i0ngunn3r
Вопросов: 11
Ответов: 30
Профиль | | #7
Добавлено: 22.08.06 15:48
Да не за что..
Чтоб не создавать новую тему.. вопрос - как применить IXMLHttpRequest?
Это, как я понял, ведь не API-функция? Если нет, то как его использовать?
Номер ответа: 8
Автор ответа:
Softer
ICQ: 203660381
Вопросов: 29
Ответов: 205
Web-сайт:
Профиль | | #8
Добавлено: 22.08.06 15:53
Если чесно, то не знаю... что-то я по твоему линку не понял... Вот ето что ли? http://www.vbnet.ru/forum/show.aspx?id=40868
Номер ответа: 9
Автор ответа:
i0ngunn3r
Вопросов: 11
Ответов: 30
Профиль | | #9
Добавлено: 22.08.06 16:03
Нет, не vbnet.
эта функция предназначена для скачивания небольших файлов. например, скачать баннер или маленькую картинку с какогото сайта. лучше качай через винсок. правда потрудиться придётся, но зато всё нормально будет: и скорость скачивания, и зависать не будет. ну а если тебе приспичило качать через апи ф-цию, то в проге помимо главного экзешника создай что-то типа download.exe. в этой проге обрабатывай коандную строку (Command). Для того чтобы потом скачать файл, в своей главной программе вызови этот Download.exe с необходимыми параметрами командной строки. Например, это у тебя будет в коде проги Download.exe :
Private Sub Form_Load()
dim URL as string
URL = Command
DownloadFile URL, "куда скачать"
End
End Sub
А в главной проге будет так:
Private Sub cmdDownload_Click()
Shell App.path & "\download.exe " & txtURL.text , vbHide
End Sub
Тогда зависнет прога Download.exe , а главное окно твоей главной проги будет нормально. Для того, чтобы юзер понял, что файл скачался, в коде download.exe до начала скачивания создай какой нибудь файл, а после скачивания удали. А главная прога будет проверять существует ли файл. Если не существует, значит файл скачался. Можешь даже реестр использовать, и оставить какую нибудь метку. Например, файл скачался успешно или нет. Можешь сделать кнопку "Отмена". При клоике на неё вызывай TerminateProcess или какую нибудь другую ф-цию чтобы убить процесс Download.exe (Можно и SendMessage использовать, ведь тебе будет известно имя окна).
В принципе, можно сделать и скорость скачивания, но проблема в том, как узнать размер файла, который ты скачиваешь.
вот, попробуй этот пример:
www.v-adix.narod.ru/files2/multidownloader.zip
не помню как он качает, главное что качает. может поможет...
Еще вариант:
Option Explicit
Private Sub Form_Click()
Dim sAddress As String
sAddress = InputBox("URL"
With Winsock1
'Для Proxy
While .State <> sckClosed
.Close
Wend
.Connect "192.168.1.1", 3128
Do
DoEvents
Loop While .State <> sckConnected
.SendData "GET " & sAddress
.SendData vbCrLf
.SendData "User-Agent: Mozilla/2.0 (Win95;I)"
End With
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim F As Long, sData As String
F = FreeFile
Winsock1.GetData sData
Debug.Print sData
If Len(sData) = 0 Then Debug.Print "onload....Ok"
End Sub
sAddress должен быть равен "/файл".
Т.е. если хост в винсоке ты задал как "yandex.ru", а тебе надо скачать файл "yandex.ru/logo.gif", то ты указываешь winsock1.remotehost="yandex.ru" и sAddress="/logo.gif"
Номер ответа: 10
Автор ответа:
i0ngunn3r
Вопросов: 11
Ответов: 30
Профиль | | #10
Добавлено: 22.08.06 16:05
ЗЫ: Вторая страница имел в виду не яндексовская, а вторая ссылка (на первой странице )
Номер ответа: 11
Автор ответа:
Softer
ICQ: 203660381
Вопросов: 29
Ответов: 205
Web-сайт:
Профиль | | #11
Добавлено: 22.08.06 16:07
А! Понял! Сенкс!
Номер ответа: 12
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #12
Добавлено: 22.08.06 16:18
URLOpenPullStream не проще?
По поводу IXMLHttpRequest. Эту функцию экспортирует библиотека msxml*.dll. Как ActiveX вариант - юзай XMLHTTP из той же библы.
Номер ответа: 13
Автор ответа:
i0ngunn3r
Вопросов: 11
Ответов: 30
Профиль | | #13
Добавлено: 22.08.06 18:20
Хммм.. Спасибо)
Номер ответа: 14
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #14
Добавлено: 22.08.06 19:03
IXMLHttpRequest - это не функция, а интерфейс, наследованный от IDispatch
Номер ответа: 15
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #15
Добавлено: 23.08.06 03:41
Shell App.path & "\download.exe " & txtURL.text , vbHide
End Sub
ужОс какой-то...
Зачем извращаться, если достаточно сделать все по правильному - как уже говорили, через Winsock