А как качать совсем-совсем асинхронно?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

А как качать совсем-совсем асинхронно?

Сообщение tyomitch » 30.06.2006 (Пт) 1:51

Хочется запустить скачку (в файл) и дальше заниматься своими делами.
.net не подходит по условию.
URLDownloadToFile с наворотами не подходит, потому что возвращается она только после полной скачки.
WinHTTP не подходит, потому что сохранять результат в файл придётся в обработчике, запросов может быть много, а обработчик только один.
Массив из MsInet (или ещё страшнее: массив из винсоков) вроде бы подходит, но может есть что-нибудь удобнее?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.06.2006 (Пт) 3:12

А удобно сокетами. Пишешь класс Task...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

NashRus
Постоялец
Постоялец
 
Сообщения: 386
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 30.06.2006 (Пт) 8:47

1. COM EXE
2. URLDownloadToFile с наворотами это с келбек интерфейсом ?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.06.2006 (Пт) 9:17

1. XMLHTTPRequest?
2. А что мешает сделать несколько обработчиков WinHTTP?
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.06.2006 (Пт) 11:01

2NashRus:
1. Не понял. При чём тут это?
2. именно

2Antonariy:
1. Те же проблемы, что и с WinHTTP
2. А как ты сделаешь из них массив WithEvents? (жуткими хаками с IConnectionPoint-ами?)
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.06.2006 (Пт) 11:36

жуткими хаками с IConnectionPoint-ами?
Даже не хочу знать что это такое :shock:

Делаешь класс с WithEvents WinHTTP, для каждого запроса создаешь его экземпляр, передаешь в экземпляр ссылку на основной класс и хранишь эти экземпляры в коллекции в основном классе. Примерно по такому принципу я сделал библу ADOHTTP. Пример нужен?
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.06.2006 (Пт) 12:04

Antonariy писал(а):
жуткими хаками с IConnectionPoint-ами?
Даже не хочу знать что это такое :shock:

Тогда не открывай этот файл: http://web.archive.org/web/200107030334 ... =grl_event
Изображение

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.06.2006 (Пт) 12:12

Архив сломан. А описанный мной способ тоже не подходит?
Лучший способ понять что-то самому — объяснить это другому.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.06.2006 (Пт) 12:29

Архив чинится дописыванием нулевого байта в конец.
Все архивы на web.archive.org сломаны, и чинятся таким образом.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.06.2006 (Пт) 12:29

Не, правда, tyomitch, ты чего...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

NashRus
Постоялец
Постоялец
 
Сообщения: 386
Зарегистрирован: 18.03.2006 (Сб) 1:16

Сообщение NashRus » 30.06.2006 (Пт) 12:39

т.е. получается

1. COM EXE - типа в отдельном потоке запускать
2. URLDownloadToFile с наворотами келбек интерфейса
3. XMLHTTPRequest или WinHTTP с IConnectionPoint или с объектом оберткой к каждому запросу.
4. Winsock

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.06.2006 (Пт) 13:15

По поводу 1. до сих пор не понял.
Чем мой объект, запущенный в отдельном потоке, отличался бы от XMLHTTPRequest или WinHTTP?

2GSerg: а я ничего. Я думал, может что готовое есть.

Внезапно заметил, что ссылки стали подчёркиваться. Это давно так?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 30.06.2006 (Пт) 19:50

Решил поступить необычно: использовать URLDownloadToFile без наворотов, но в отдельном fire-and-forget потоке.
Падает в urlmon.dll :-(
Параметры на семь раз проверены под отладчиком.
Что ему ещё надо? CoInitialize какой-нибудь?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.07.2006 (Сб) 8:12

tyomitch писал(а):Это давно так?

Недавно.
РейШейд со стилями шалили-с.

tyomitch писал(а):CoInitialize какой-нибудь?

Угу. Для каждого потока.

Напиши класс Task один раз и не страдай фигнёй.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.07.2006 (Пн) 2:25

Дело было не в OleInitialize -- к моменту выполнения потока с URLDownloadToFile строка с урлом уже затиралась в основном потоке. Исправил, заработало.

Кстати, WinHttp не пользуется кэшем, не понимает стандартные настройки прокси, и совсем не умеет работать с SOCKS.
Качалка через urlmon всё-таки поудобнее будет.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 03.07.2006 (Пн) 3:59

Вот окончательный вариант, в назидание потомкам :-)

Код: Выделить всё
Public Sub DownloadToFile(ByVal URL As String, ByVal FileName As String)
Static asm(38) As Byte
If 0 = asm(0) Then
    CopyMemory asm(0), &H4245C8B, 4
    CopyMemory asm(4), &H538D038B, 4
    CopyMemory asm(8), &H6A006A04, 4
    CopyMemory asm(12), &H6A525000, 4
    CopyMemory asm(16), &H15FF00, 3
    CopyMemory asm(19), VarPtr(asm(31)), 4
    CopyMemory asm(23), &H15FF53, 3
    CopyMemory asm(26), VarPtr(asm(35)), 4
    asm(30) = &HC3
    CopyMemory asm(31), GetProcAddress(GetModuleHandle("urlmon"), "URLDownloadToFileA"), 4
    CopyMemory asm(35), GetProcAddress(GetModuleHandle("kernel32"), "GlobalFree"), 4
End If

Dim Parcel As Long: Parcel = GlobalAlloc(0, 6 + Len(URL) + Len(FileName))
Dim pFileName As Long: pFileName = Parcel + 5 + Len(URL)
CopyMemory ByVal Parcel + 0, pFileName, 4
CopyMemory ByVal Parcel + 4, ByVal URL, Len(URL) + 1
CopyMemory ByVal pFileName, ByVal FileName, Len(FileName) + 1
CreateThread ByVal 0&, 0, asm(0), ByVal Parcel, 0, 0
End Sub


Имхо вопрос исчерпан.
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

    TopList