Re[2]: Re[2]: URL monikers & uploading progress
От: helvic  
Дата: 17.02.03 16:27
Оценка:
Здравствуйте, 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&gt;/url],</span><br />
<br />
Спасибо за помощь, но с этим примером я уже давным давно знаком.... не выдает в нем ulProgress и ulProgresMax при аплоадинге. В то время, как при скачивании респонса с сервера, который следует сразу же за POST операцией, эти значения устанавливаються в ненулевые, что дает возможность отображать прогресс инфо. <br />
<span class='lineQuote level1'><br />
AS&gt;[url=http://groups.google.com/groups?q=post+IBindStatusCallback&amp;hl=ru&amp;lr=&amp;ie</span><br />
<span class='lineQuote level1'>AS&gt;=UTF-8&amp;oe=UTF-8&amp;selm=093fed10.0b3386b8%40usw-ex0102-084.remarq.com&amp;rnum=3]эт</span><br />
<span class='lineQuote level1'>AS&gt;о</span>
и

AS>[url=http://groups.google.com/groups?q=post+IBindStatusCallback&amp;start=10&amp;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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.