Здравствуйте, 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;
}