Всем известно, что реализовав свой IBindStatusCallback интерфейс, можно с помощю URL моникеров закачивать асинхронно ресурсы веб (странички, файлы и так далее). Главное достоинство такого подхода в том, что Urlmon.dll будет вызывать асинхронно ваш IBindStatusCallback::OnProgress() с подробной информацией о текушем прогрессе операции, както сколько байт закачано в текущий момент, сколько байт информации нужно еше закачать и так далее.
Если в реализации метода IBindStatusCallback::GetBindInfo() указать BINDVERB_POST вместо BINDVERB_GET можно аплоадить файлы на веб-сервер. НО вот только в этом случае URLmon.dll НЕ ДАЕТ никакой информации о прогрессе данной операции, тоесть метод IBindStatusCallback::OnProgress() вызываеться только два раза, в начале операции аплоада (HTTP POST) и в конце

. Как бы это заставить URL moniker'ы показывать прогресс аплоада??? Может кто когдато реализовывал HTTP аплоад файлов на сервер, показывая при этом прогресс данной операции — сколько байт залито/сколько байт осталось залить и т.п. ? Помогите пожалуйста кто чем может люди добрые.
"helvic" <forum@rsdn.ru> wrote in message
news:194048@news.rsdn.ru...
[]
> Если в реализации метода IBindStatusCallback::GetBindInfo() указать
BINDVERB_POST вместо BINDVERB_GET можно аплоадить файлы на веб-сервер. НО
вот только в этом случае URLmon.dll НЕ ДАЕТ никакой информации о прогрессе
данной операции, тоесть метод IBindStatusCallback::OnProgress() вызываеться
только два раза, в начале операции аплоада (HTTP POST) и в конце

. Как
бы это заставить URL moniker'ы показывать прогресс аплоада??? Может кто
когдато реализовывал HTTP аплоад файлов на сервер, показывая при этом
прогресс данной операции — сколько байт залито/сколько байт осталось залить
и т.п. ? Помогите пожалуйста кто чем может люди добрые.
Насколько я знаю, с URLDownloadToFile проблем ни у кого не было.
Posted via RSDN NNTP Server 1.4.5
Здравствуйте, Alexey Shirshov, Вы писали:
AS>"helvic" <forum@rsdn.ru> wrote in message news:194048@news.rsdn.ru...
AS>[]
>> Если в реализации метода IBindStatusCallback::GetBindInfo() указать
AS>BINDVERB_POST вместо BINDVERB_GET можно аплоадить файлы на веб-сервер. НО
AS>вот только в этом случае URLmon.dll НЕ ДАЕТ никакой информации о прогрессе
AS>данной операции, тоесть метод IBindStatusCallback::OnProgress() вызываеться
AS>только два раза, в начале операции аплоада (HTTP POST) и в конце
. Как
AS>бы это заставить URL moniker'ы показывать прогресс аплоада??? Может кто
AS>когдато реализовывал HTTP аплоад файлов на сервер, показывая при этом
AS>прогресс данной операции — сколько байт залито/сколько байт осталось залить
AS>и т.п. ? Помогите пожалуйста кто чем может люди добрые.
AS>Насколько я знаю, с URLDownloadToFile проблем ни у кого не было.
Молодой человек, вы если беретесь на что-то отвечать, просьба хотя бы внимательно прочитать и вникнуть в проблему
На сколько я знаю между Download и Upload есть "небольшая" разница. При чем сдесь URLDownloadToFile() ???
Вопрос заключался в том, как заставить ту же URLDownloadToFile() (при условии мануальной имплементации IBindStatusCallback и передачи его в послдений параметр данного URL moniker API) при аплоадинге вызывать IBindStatusCalback::OnProgress() с текушими значениями ulProgress и ulProgressMax. При аплоадинге метод OnProgress() конечно же вызываеться, НО параметры ulProgress и ulProgresMax ВСЕГДА РАВНЫ 0.
"helvic" <forum@rsdn.ru> wrote in message
news:194790@news.rsdn.ru...
хъ
> Молодой человек, вы если беретесь на что-то отвечать, просьба хотя бы
внимательно прочитать и вникнуть в проблему
Извини, действительно не понял.
хъ
> Вопрос заключался в том, как заставить ту же URLDownloadToFile() (при
условии мануальной имплементации IBindStatusCallback и передачи его в
послдений параметр данного URL moniker API) при аплоадинге вызывать
IBindStatusCalback::OnProgress() с текушими значениями ulProgress и
ulProgressMax. При аплоадинге метод OnProgress() конечно же вызываеться, НО
параметры ulProgress и ulProgresMax ВСЕГДА РАВНЫ 0.
Почитай
это[<br />
/url],<br />
[url=http://groups.google.com/groups?q=post+IBindStatusCallback&hl=ru&lr=&ie<br />
=UTF-8&oe=UTF-8&selm=093fed10.0b3386b8%40usw-ex0102-084.remarq.com&rnum=3]эт<br />
о и
[url=
http://groups.google.com/groups?q=post+IBindStatusCallback&start=10&hl=
ru&lr=&ie=UTF-8&oe=UTF-8&selm=3c96ba76%241_1%40dnews&rnum=14]это[/url].
З.Ы. Я сам так никогда не делал, поэтому и имею некоторый интерес к
проблеме. Кроме того, я трачу свое время и силы чтобы помочь тебе, а не
кому-нибудь еще. Твое
Молодой человек, вы если беретесь на что-то отвечать, просьба хотя бы
внимательно прочитать и вникнуть в проблему.
на самом деле просто понты.
З.Ы.Ы. С такими вопросами нужно всегда приводить чуть-чуть кода, потому как
лично я не телепат.
Posted via RSDN NNTP Server 1.4.5
Здравствуйте, helvic, Вы писали:
H>Всем известно, что реализовав свой IBindStatusCallback интерфейс, можно с помощю URL моникеров закачивать асинхронно ресурсы веб (странички, файлы и так далее). Главное достоинство такого подхода в том, что Urlmon.dll будет вызывать асинхронно ваш IBindStatusCallback::OnProgress() с подробной информацией о текушем прогрессе операции, както сколько байт закачано в текущий момент, сколько байт информации нужно еше закачать и так далее.
H>Если в реализации метода IBindStatusCallback::GetBindInfo() указать BINDVERB_POST вместо BINDVERB_GET можно аплоадить файлы на веб-сервер. НО вот только в этом случае URLmon.dll НЕ ДАЕТ никакой информации о прогрессе данной операции, тоесть метод IBindStatusCallback::OnProgress() вызываеться только два раза, в начале операции аплоада (HTTP POST) и в конце
. Как бы это заставить URL moniker'ы показывать прогресс аплоада??? Может кто когдато реализовывал HTTP аплоад файлов на сервер, показывая при этом прогресс данной операции — сколько байт залито/сколько байт осталось залить и т.п. ? Помогите пожалуйста кто чем может люди добрые.
Вопрос на засыпку. А может лучше воспользоваться WININET API + OVERLAPPED ?
Здравствуйте, Tom, Вы писали:
Tom>Здравствуйте, helvic, Вы писали:
H>>Всем известно, что реализовав свой IBindStatusCallback интерфейс, можно с помощю URL моникеров закачивать асинхронно ресурсы веб (странички, файлы и так далее). Главное достоинство такого подхода в том, что Urlmon.dll будет вызывать асинхронно ваш IBindStatusCallback::OnProgress() с подробной информацией о текушем прогрессе операции, както сколько байт закачано в текущий момент, сколько байт информации нужно еше закачать и так далее.
H>>Если в реализации метода IBindStatusCallback::GetBindInfo() указать BINDVERB_POST вместо BINDVERB_GET можно аплоадить файлы на веб-сервер. НО вот только в этом случае URLmon.dll НЕ ДАЕТ никакой информации о прогрессе данной операции, тоесть метод IBindStatusCallback::OnProgress() вызываеться только два раза, в начале операции аплоада (HTTP POST) и в конце
. Как бы это заставить URL moniker'ы показывать прогресс аплоада??? Может кто когдато реализовывал HTTP аплоад файлов на сервер, показывая при этом прогресс данной операции — сколько байт залито/сколько байт осталось залить и т.п. ? Помогите пожалуйста кто чем может люди добрые.
Tom>Вопрос на засыпку. А может лучше воспользоваться WININET API + OVERLAPPED ?
OVERLAPPED не работает с Windows 95/98/ME (Программа должна работать на Windows95+, IE4+) А во вторых у вининет API много глюков... к тому же проблемы при использовании ПРОКСИ серверов, в то время как моникеры работают с прокси прозрачно.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>"helvic" <forum@rsdn.ru> wrote in message news:194790@news.rsdn.ru...
AS>хъ
>> Молодой человек, вы если беретесь на что-то отвечать, просьба хотя бы
AS>внимательно прочитать и вникнуть в проблему
AS>Извини, действительно не понял.
AS>хъ
>> Вопрос заключался в том, как заставить ту же URLDownloadToFile() (при
AS>условии мануальной имплементации IBindStatusCallback и передачи его в
AS>послдений параметр данного URL moniker API) при аплоадинге вызывать
AS>IBindStatusCalback::OnProgress() с текушими значениями ulProgress и
AS>ulProgressMax. При аплоадинге метод OnProgress() конечно же вызываеться, НО
AS>параметры ulProgress и ulProgresMax ВСЕГДА РАВНЫ 0.
AS>Почитай
AS>это[<br />
<span class='lineQuote level1'>AS>/url],</span><br />
<br />
Спасибо за помощь, но с этим примером я уже давным давно знаком.... не выдает в нем ulProgress и ulProgresMax при аплоадинге. В то время, как при скачивании респонса с сервера, который следует сразу же за POST операцией, эти значения устанавливаються в ненулевые, что дает возможность отображать прогресс инфо. <br />
<span class='lineQuote level1'><br />
AS>[url=http://groups.google.com/groups?q=post+IBindStatusCallback&hl=ru&lr=&ie</span><br />
<span class='lineQuote level1'>AS>=UTF-8&oe=UTF-8&selm=093fed10.0b3386b8%40usw-ex0102-084.remarq.com&rnum=3]эт</span><br />
<span class='lineQuote level1'>AS>о</span> и
AS>[url=http://groups.google.com/groups?q=post+IBindStatusCallback&start=10&hl=
AS>ru&lr=&ie=UTF-8&oe=UTF-8&selm=3c96ba76%241_1%40dnews&rnum=14]это[/url].
это вообще к делу не относиться.
AS>З.Ы. Я сам так никогда не делал, поэтому и имею некоторый интерес к
AS>проблеме. Кроме того, я трачу свое время и силы чтобы помочь тебе, а не
AS>кому-нибудь еще. Твое
AS>AS>Молодой человек, вы если беретесь на что-то отвечать, просьба хотя бы
AS>внимательно прочитать и вникнуть в проблему.
AS>на самом деле просто понты.
да не обижайся, ты... просто времени нет, и делать аплоад через WinInet API впадло... хотелось бы с моникерами добиться всего... но по видимому микрософт решила, что при аплоадинге прогресс бар пользователям не нужен... ну и козлы
AS>З.Ы.Ы. С такими вопросами нужно всегда приводить чуть-чуть кода, потому как
AS>лично я не телепат.
ну вот тебе чуток кода, если это както поможет:
это хедер (урезаный) (реализация IBindStatusCallback путем наследования ATL ного CBindStatusCallback)
template <class T> class CHTTPTransport : public CBindStatusCallback<T>, public IHttpNegotiate
{
public:
BEGIN_COM_MAP(CHTTPTransport<T>)
COM_INTERFACE_ENTRY(IBindStatusCallback)
COM_INTERFACE_ENTRY(IHttpNegotiate)
END_COM_MAP()
typedef void (T::*ATL_PONSTOPBINDING)(HRESULT hresult, LPCWSTR szError, CXMLParser* xmlParser, CString strValue);
CHTTPTransport();
public:
static HRESULT CreateObject(T* pT, HWND hwndProgress, CComObject<CHTTPTransport<T> > **pObject);
HRESULT StartDownload(CString& url, ATL_PDATAAVAILABLE pFunc, ATL_PONSTOPBINDING pStopFunc);
// IBIindStatusCallback interface
HRESULT __stdcall OnStopBinding(HRESULT hr, LPCWSTR szError );
HRESULT __stdcall OnProgress( ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText );
HRESULT __stdcall OnDataAvailable(DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed);
HRESULT __stdcall GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindInfo);
}
этот код стартует аплоад:
hr = pTransport->StartDownload(url,pFunc,pStopFunc);
где pTransport — зкземпляр класса CHTTPTransport, url — путь к JSP сервлету на веб сервере, которые принимает данные по HTTP POST
а это реализация IBindStatusCallback::GetBindInfo():
template <class T> HRESULT __stdcall CHTTPTransport<T>::GetBindInfo(DWORD* pgrfBINDF, BINDINFO* pbindInfo)
{
//if (m_fRedirect && BINDVERB_POST == m_dwAction)
//{
// We're being redirected by the server. Stop posting
// SetStatusText(_T("Switching method to GET"));
// m_dwAction = BINDVERB_GET;
//}
*pgrfBINDF = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE;
*pgrfBINDF |= BINDF_GETNEWESTVERSION | BINDF_NOWRITECACHE | BINDF_PRAGMA_NO_CACHE;
// Set up the BINDINFO data structure
pbindInfo->cbSize = sizeof(BINDINFO);
pbindInfo->dwBindVerb = m_dwAction; // here's where the action is defined
pbindInfo->szExtraInfo = NULL;
// Initialize the STGMEDIUM.
memset(&pbindInfo->stgmedData, 0, sizeof(STGMEDIUM));
pbindInfo->grfBindInfoF = 0;
pbindInfo->szCustomVerb = NULL;
// set up action-specific members
switch(m_dwAction)
{
case BINDVERB_POST:
if (m_hDataToPost)
{
// Fill the STGMEDIUM with the data to post
pbindInfo->stgmedData.tymed = TYMED_HGLOBAL; // this is the only medium urlmon supports right now
pbindInfo->stgmedData.hGlobal = m_hDataToPost;
в m_hDataToPost типа HGLOBAL предварительно занесены данные прочитаные из файла на диске
//pbindInfo->stgmedData.pUnkForRelease = (LPUNKNOWN)(LPBINDSTATUSCALLBACK)this; // maintain control over the data.
//CBindStatusCallback<T>::AddRef(); // It will be freed on final release
pbindInfo->cbstgmedData = // this must be exact!
m_cbDataToPost; // Do not rely on GlobalSize() which rounds up to the nearest power of two.
}
break;
case BINDVERB_GET:
break;
default:
return E_FAIL;
}
return S_OK;
}
а это собственно говоря функция IBindStatusCallBack::OnProgress() где при аплоиднге ATLTRACE всегда выводит
Progress: ulProgress: 0, ulProgressMax : 0 ....
template <class T> HRESULT __stdcall CHTTPTransport<T>::OnProgress( ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText )
{
ATLTRACE("Progress: ulProgress: %d, ulProgressMax : %d, StatusCode : %d\n",ulProgress,ulProgressMax,ulStatusCode);
return S_OK;
}