Страница: 1 | 2 | 3 |
Вопрос: UrlDownloadToFile
Добавлено: 22.08.06 14:24
Автор вопроса: i0ngunn3r
Ответы
Всего ответов: 31
Номер ответа: 16
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #16
Добавлено: 23.08.06 13:29
Sharp, не цепляйся к словам. Думаю это и так всем понятно. Просто человек неправильно выразился, ну а я поддержал. Речь то шла про его реализацию
Номер ответа: 17
Автор ответа:
i0ngunn3r
Вопросов: 11
Ответов: 30
Профиль | | #17
Добавлено: 23.08.06 17:08
Через Winsock, конечно, можно, но т.к. UrlDownloadToFile использует Cookies от IE (а мне надо качать html/php страницы), а Winsock - нет, то тут появляется еще куча проблем, и приходится писать чуть ли не свой браузер.
Задача такова - на странице есть форма (ХТМЛьная) (с логином и паролем), пробовал через Винсок через "POST /index.html", затем "Content-type: multiform" - что-то вроде этого, затем содержимое формы (название htmlных текстбоксов и их значение - логин и пароль)
Но у меня, наверн, что-то неправильно (что более вероятно) - ибо не работает.
Номер ответа: 18
Автор ответа:
i0ngunn3r
Вопросов: 11
Ответов: 30
Профиль | | #18
Добавлено: 23.08.06 18:28
Кстати, извините, можно пример использования URLOpenPullStream? :\
Номер ответа: 19
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #19
Добавлено: 23.08.06 20:07
Мне понятно, тебе понятно. А какой-нибудь Вася Пупкин будет несколько часов искать "функцию" IXmlHttpRequest по F2 или даже в ApiViewer и ничего не найдет.
Номер ответа: 20
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #20
Добавлено: 23.08.06 21:21
Можно попробовать перед вызовом функции поставить DoEvents, это может помочь.
Номер ответа: 21
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #21
Добавлено: 23.08.06 21:26
Кстати, как я вижу по документации, в UrlDownloadToFile судя по всему можно делать асинхронные операции, т.е. ты вызвал функцию, она работает, твоя программа пошла выполняться дальше, функция через callback потом оповещает тебя о завершении загрузки.
Правда там не совсем политкорректный способ оповещения, какой-то IBindStatusCallback, я не уверен что в VB6 это можно разрулить...
Номер ответа: 22
Автор ответа:
Nash Bridges
Вопросов: 5
Ответов: 139
Профиль | | #22
Добавлено: 23.08.06 23:51
UrlDownloadToFile - синхронная функция, т.е. код дальше не будет выполняться пока эта функция не отработает.
Другое дело, что действительно можно реализовать келбек-интерфейс и будут оповещения и все что надо. А вот что делать в этих келбеках (например, прогресс) - решать программисту. так что появляется возможность обработать кой-какие сообщения во время келбека.
Номер ответа: 23
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #23
Добавлено: 24.08.06 12:10
На васме были статейки по этому поводу. Я бы сделал проще - пустил эту хрень в отдельном потоке и не грелся бы со всякими интерфейсами. А URLOpenPullStream использовать довольно просто если подключишь olelib.tlb - рулезная фича.
Кстати, если dll не ломает - http://www.vb.kiev.ua/code/networks/CSAsyncTransfer.zip. Она с исходниками, но, честно, сам не тестировал
Номер ответа: 24
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #24
Добавлено: 24.08.06 12:59
Another fine solution from Sharp
#include <windows.h>
#include <iostream>
#include <vector>
#include <string>
using namespace std;
#include <conio.h>
#pragma comment (lib, "urlmon.lib"
#define NOTIMPL(method) method { return E_NOTIMPL; }
class DownloadProgress : public IBindStatusCallback {
public:
DownloadProgress(){
m_nRef = 0;
}
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppv){
HRESULT hr = S_OK;
if(IsEqualIID(riid, IID_IUnknown)){
*ppv = (void *)static_cast<IBindStatusCallback *>this);
} else if(IsEqualIID(riid, IID_IBindStatusCallback)){
*ppv = (void *)static_cast<IBindStatusCallback *>this);
} else{
hr = E_NOINTERFACE;
*ppv = NULL;
}
if(SUCCEEDED(hr)){
reinterpret_cast<IUnknown *>*ppv)->AddRef();
}
return hr;
}
ULONG STDMETHODCALLTYPE AddRef(void){
m_nRef++;
return m_nRef;
}
ULONG STDMETHODCALLTYPE Release(void){
m_nRef--;
if(m_nRef == 0) delete this;
return m_nRef;
}
HRESULT STDMETHODCALLTYPE OnStartBinding(DWORD dwReserved, IBinding *pib){
return E_NOTIMPL;
}
NOTIMPL(HRESULT STDMETHODCALLTYPE GetPriority(LONG *pnPriority));
NOTIMPL(HRESULT STDMETHODCALLTYPE OnLowResource(DWORD reserved));
HRESULT STDMETHODCALLTYPE OnProgress(ULONG ulProgress, ULONG ulProgressMax,
ULONG ulStatusCode, LPCWSTR szStatusText){
cout << "ulProgress :" << ulProgress << "ulProgressMax: " << ulProgressMax << endl;
return S_OK;
}
NOTIMPL(HRESULT STDMETHODCALLTYPE OnStopBinding(HRESULT hresult, LPCWSTR szError));
NOTIMPL(HRESULT STDMETHODCALLTYPE GetBindInfo(DWORD *grfBINDF, BINDINFO *pbindinfo));
NOTIMPL(HRESULT STDMETHODCALLTYPE OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed));
NOTIMPL(HRESULT STDMETHODCALLTYPE OnObjectAvailable(REFIID riid, IUnknown *punk));
public:
ULONG m_nRef;
};
int main(){
DownloadProgress *dp = new DownloadProgress;
HRESULT hRes = URLDownloadToFile(NULL, "http://127.0.0.1/_mir/articles/TrueType.tar.bz2", "F:\\1.tbz", 0, dp);
if(SUCCEEDED(hRes)){
cout << "ownload complete!" << endl;
} else{
cout << "ownload failed..." << endl;
}
getch();
return 0;
}
Номер ответа: 25
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #25
Добавлено: 24.08.06 14:39
И ведь не лень писать было )
Кстати, если подключить olelib.tlb, то можно имплементировать IBindStatusCallback в своем VB классе. Это для нелюбителей Dll.
Номер ответа: 26
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #26
Добавлено: 24.08.06 15:55
Ну вообще я это довольно давно писал
Номер ответа: 27
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #27
Добавлено: 24.08.06 17:04
LOL! Ты хотел хотел сказать "Я бы сделал сложнее"?
Номер ответа: 28
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #28
Добавлено: 24.08.06 17:13
URLDownloadToFile - это говнометод. Поэтому лучше все же действительно пустить в отдельном треде
Номер ответа: 29
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #29
Добавлено: 24.08.06 17:20
Ну чего ж там сложного? Разумеется, если бы это нужно было для проекта, я бы воткнул подобный код в одну из dllек, их всегда хватает. А если чисто на VB... Я уже давно юзаю вместо Standart.exe ActiveX.exe Standalone, там подобных проблем не бывает.
Ну ведь недавно ссылку публиковали на васм, где эту тему разрулили из VB без всяких библиотек (вроде, я сам по ссылке не прошел).
По поводу вышеизложенного кода - фичу недопонял, смысл был в том чтобы производить закачку в параллельном потоке а не пытаться отработать сообщения в callback и вывести итог в консоль. Потоков код не создает и так же презабавно интерфейсную часть повесит
Номер ответа: 30
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #30
Добавлено: 25.08.06 13:18