Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

WinInet: upload progress

92
09 августа 2007 года
Тень Пса
2.2K / / 19.10.2006
Доброго времени суток :)

возник вопрос: как наблюдать прогресс отправки файла через WinInet?

ума не приложу... копался в MSDN нашел решение, но использовать у меня его не получилось... поэтому решил спросить здесь :)

может кто знает? :)
246
09 августа 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: Тень Пса

ума не приложу... копался в MSDN нашел решение, но использовать у меня его не получилось...


Решение в студию, будем разбираться:)

92
10 августа 2007 года
Тень Пса
2.2K / / 19.10.2006
извините, не в MSDN а на support.microsoft.com

Код:
BOOL UseHttpSendReqEx(HINTERNET hConnect, TCHAR *upFile)
   {
     INTERNET_BUFFERS BufferIn = {0};
     DWORD dwBytesRead;
     DWORD dwBytesWritten;
     BYTE pBuffer[1024]; // Read from file in 1K chunks
     BOOL bRead, bRet;

     BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS );

     HINTERNET hRequest = HttpOpenRequest (hConnect, "PUT",
         "/test/page.htm", NULL, NULL, NULL,  0, 0);
     if (!hRequest)
     {
       printf("Failed to open request handle: %lu\n", GetLastError ());
       return FALSE;
     }

     HANDLE hFile = CreateFile (upFile, GENERIC_READ, FILE_SHARE_READ,
         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
     if (hFile == INVALID_HANDLE_VALUE)
     {
       printf("\nFailed to open local file %s.", upFile);
       return FALSE;
     }

     BufferIn.dwBufferTotal = GetFileSize (hFile, NULL);
     printf ("File size is %d\n", BufferIn.dwBufferTotal );

     if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, HSR_INITIATE, 0))
     {
       printf( "Error on HttpSendRequestEx %lu\n",GetLastError() );
       return FALSE;
     }

     DWORD sum = 0;
     do
     {
       if  (!(bRead = ReadFile (hFile, pBuffer, sizeof(pBuffer),
           &dwBytesRead, NULL)))
       {
         printf ("\nReadFile failed on buffer %lu.",GetLastError());
         break;
       }
       if (!(bRet=InternetWriteFile( hRequest, pBuffer, dwBytesRead,
           &dwBytesWritten)))
       {
         printf ("\nInternetWriteFile failed %lu", GetLastError());
         break;
       }
       sum += dwBytesWritten;
     }
     while (dwBytesRead == sizeof(pBuffer)) ;

     CloseHandle (hFile);
     printf ("Actual written bytes: %d\n", sum);

     if(!HttpEndRequest(hRequest, NULL, 0, 0))
     {
       printf( "Error on HttpEndRequest %lu \n", GetLastError());
       return FALSE;
     }
     return TRUE;
   }


вот, но здесь метод PUT, а у меня POST, и вместо самого файла есть просто массив byte'ов =)

вчера уже весь день бился над этим... и никак...
92
10 августа 2007 года
Тень Пса
2.2K / / 19.10.2006
а вот функция, которая POST посылает, ей я и передаю byte [] в котором лежит всё тело запроса, в параметр header - соответсвенно отдаю заголовки...

GLOBAL_SERVER - это адрес, или ip сервера (host.com например);
GLOBAL_SCRIPT_PATH - это уже путь до скрипта куда делаем запрос ("/" или "/cgi-bin/xml.cgi" ну и тд);

эти переменные уже определены.

Код:
AnsiString TForm1::Post(AnsiString header, const void * data2, const int content_length)
{
DWORD dwServiceType;
DWORD buffsize=0;
AnsiString strData;
    HINTERNET hSession=NULL;
    HINTERNET hConnect=NULL;
    HINTERNET hHTTPReq=NULL;
    hSession=InternetOpen("Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.5) Gecko/20070713 Firefox/2.0.0.5", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if (hSession)
    {
        hConnect=InternetConnect(hSession, GLOBAL_SERVER, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
        if (hConnect)
        {
            hHTTPReq=HttpOpenRequest(hConnect, "POST", GLOBAL_SCRIPT_PATH, NULL, NULL, NULL,
                INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_KEEP_CONNECTION
                |INTERNET_FLAG_IGNORE_CERT_CN_INVALID,0);
            if(hHTTPReq)
            {
                int TryCounts=1;
                while (1)
                {
                    BOOL resReq=HttpSendRequest( hHTTPReq, header.c_str(), header.Length(), (LPVOID)data2, content_length );
                    if (!resReq)
                    {
                        DWORD dwError = GetLastError();
                        if (dwError != ERROR_INTERNET_INVALID_CA)
                                                {
                                                 break;
                                                }
                                                else
                         {
                         DWORD dwFlags;
                         DWORD dwBuffLen = sizeof(dwFlags);
                         InternetQueryOption(hHTTPReq, INTERNET_OPTION_SECURITY_FLAGS, (LPVOID)&dwFlags, &dwBuffLen);
                         dwFlags |= SECURITY_FLAG_IGNORE_UNKNOWN_CA;
                         InternetSetOption(hHTTPReq, INTERNET_OPTION_SECURITY_FLAGS, &dwFlags, sizeof(dwFlags));
                         continue;
                          }
                      }
                      else
                      {
                          DWORD dwStatusCode=0;
                          GetStatusCodeFormHTTPReq(hHTTPReq, &dwStatusCode);
                          if ((dwStatusCode==200 && data2!=NULL) || (dwStatusCode>=200 && dwStatusCode<=299))
                          {
                              char rBuffer[1024];
                              DWORD rBytes=0;
                              while (1)
                              {
                                  InternetReadFile(hHTTPReq, rBuffer, 1023, &rBytes);
                                  if (rBytes==0) break;
                                  rBuffer[rBytes]=0;
                                  strData+=(TCHAR *)rBuffer;
                              }
                          }
                          else
                          {
                         if (TryCounts==0) //Может сказать об ошибке???
                            break;
                        }
                        break;
                    }
                }
                InternetCloseHandle(hHTTPReq);
            }
            InternetCloseHandle(hConnect);
        }
        InternetCloseHandle(hSession);
    }
return strData;
}
я так предполагаю, что мне это тело запроса и надо использовать как "файл" в предыдущем примере, но что-то пока что не получилось....
246
10 августа 2007 года
GIZMO
1.8K / / 30.07.2004
Цитата: Тень Пса
а вот функция, которая POST посылает, ей я и передаю byte [] в котором лежит всё тело запроса, в параметр header - соответсвенно отдаю заголовки...

я так предполагаю, что мне это тело запроса и надо использовать как "файл" в предыдущем примере, но что-то пока что не получилось....


посмотри INTERNET_STATUS_CALLBACK WINAPI InternetSetStatusCallback(
HINTERNET hInternet,
INTERNET_STATUS_CALLBACK lpfnInternetCallback
);
не уверен, но может это то, что нужно.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог