Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с InternetReadFile, Что не так 
:(
    Опции темы
devmstr
  Дата 1.2.2005, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Что не так
Есть прога на Delphi - пашет.


Перевел на С++, не загружает. При вызове InternetReadFile ко-во прочитанный байтов - 0;
Код

#include <windows.h>
#include <wininet.h>
#include <iostream>

using namespace std;

bool DownLoadFile(char * Url,char* Path);

int main()
{
   
   DownLoadFile("http://mastersoftlab.narod.ru/1.exe","c:\\temp\\D.exe");
   return 0;
}



bool DownLoadFile(char * Url,char* Path)
{
   HINTERNET NetHandle;
   HINTERNET UrlHandle;
   char Buffer[1024];

   FILE*f= fopen(Path,"w+");
   //Инициализация приложения
   NetHandle   =   InternetOpen("Downloader",INTERNET_OPEN_TYPE_PRECONFIG,
       NULL,NULL,0);

   if (NetHandle!=NULL)
   {
 UrlHandle = InternetOpenUrl(NetHandle, Url, NULL, 0,
           INTERNET_FLAG_RELOAD,0);
 
 if (UrlHandle!=NULL)
 {
  cout<<"GetUrl";
   int tempsize=0;
   DWORD    dwDownloaded;  // size of the downloaded data
   do
   {
   memset(&Buffer,0,1024);
dwDownloaded=0;
   if (InternetReadFile(NetHandle,&Buffer,sizeof(Buffer),&dwDownloaded))
    { tempsize=+dwDownloaded;
       cout<<tempsize;
    }
   }
   while (dwDownloaded!=0);
   InternetCloseHandle(UrlHandle);
cin>>dwDownloaded;
 }
}


   InternetCloseHandle(NetHandle);

   return true;
}



Исходная прога(работает):

Код


function DownloadFile(const Url: string; path:string): string;
var
NetHandle: HINTERNET;
UrlHandle: HINTERNET;
Buffer: array[0..1024] of char;
BytesRead: cardinal;
f:file;
size:Cardinal;

tempsize:integer;
begin

assignfile(f,path);
rewrite(f,1);


Result := '';
tempsize:=0;

NetHandle := InternetOpen('Delphi 7.x', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

if Assigned(NetHandle) then
  begin

    UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);


    if Assigned(UrlHandle) then
{ UrlHandle правильный? Начинаем загрузку }
      begin

        Size := InternetSetFilePointer (UrlHandle, 0, 0, FILE_END, 0);
        Form1.Label1.Caption:=inttostr(Size);

        InternetSetFilePointer (UrlHandle, 0, 0, FILE_BEGIN, 0);
        ShowMessage(inttostr(size));
        FillChar(Buffer, SizeOf(Buffer), 0);
        repeat

          Result := Result + Buffer;

          FillChar(Buffer, SizeOf(Buffer), 0);

          InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
          inc(tempsize,SizeOf(Buffer));
          Form1.Caption:=inttostr(tempsize);
          Form1.Label2.Caption:=inttostr(tempsize);
          if size<>0 then
           Form1.ProgressBar1.Position:=trunc((tempsize / size) * 100);

          if BytesRead <>0 then
          BlockWrite(f,buffer,SizeOf(Buffer));
        until BytesRead = 0;
        InternetCloseHandle(UrlHandle);
      end
    else
      begin
{ UrlHandle неправильный. Генерируем исключительную ситуацию. }
        raise Exception.CreateFmt('Cannot open URL %s', [Url]);
      end;

    InternetCloseHandle(NetHandle);
  end
else
{ NetHandle недопустимый. Генерируем исключительную ситуацию }
  raise Exception.Create('Unable to initialize Wininet');


 closefile(f);
 ShowMessage('OK');
end;



Пашет.

Это сообщение отредактировал(а) magician - 1.2.2005, 08:31


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
devmstr
Дата 1.2.2005, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Вот переделал, теперь загружает, но сохраняет нормально лишь txt, а все остальное doc, exe портит,
где то явно появляются отличия. Я так понимаю проблема в fwrite. Что-то я не учитываю.
Помогите пожалуста. Немогу увидить место, где я протупил.
Код


#include <windows.h>
#include <wininet.h>
#include <iostream>

using namespace std;

int WINAPI Dumper(HINTERNET hResource);

int main()
{
char *Url="http://mastersoftlab.narod.ru/include.doc";
HINTERNET NetHandle;
   HINTERNET UrlHandle;
   NetHandle   =   InternetOpen("Downloader",INTERNET_OPEN_TYPE_PRECONFIG,
       NULL,NULL,0);
   UrlHandle = InternetOpenUrl(NetHandle, Url, NULL, 0,
            INTERNET_FLAG_RELOAD,0);
 if (UrlHandle!=NULL)
 {
Dumper(UrlHandle);
 }

   InternetCloseHandle(NetHandle);
return 0;
}



int WINAPI Dumper(HINTERNET hResource)
{
LPSTR    lpszData;      // buffer for the data
DWORD    dwSize;        // size of the data available
DWORD    dwDownloaded;  // size of the downloaded data
DWORD    dwSizeSum=0;   // size of the data in the textbox
LPSTR    lpszHolding;   // buffer to merge the textbox data and buffer
int sum=0;

char *Path = "c:\\temp\\includeD.doc";
FILE*f= fopen(Path,"w+");
// This loop handles reading the data.  
do
{
 // The call to InternetQueryDataAvailable determines the amount
 // of data available to download.
 if (!InternetQueryDataAvailable(hResource,&dwSize,0,0))
 {
  fclose(f);
  return FALSE;
 }
 else
 {    
  // Allocate a buffer of the size returned by
  // InternetQueryDataAvailable.
  lpszData = new char[dwSize+1];
  // Read the data from the HINTERNET handle.
  if(!InternetReadFile(hResource,(LPVOID)lpszData,dwSize,&dwDownloaded))
  {
   delete[] lpszData;
   break;
  }
  else
  {
   int sumt=fwrite(lpszData,sizeof(char),dwSize,f);
   sum=sum+sumt;

   delete[] lpszData;
   dwSizeSum = dwSizeSum + dwDownloaded;
   cout<<dwSizeSum<<endl;
   // Check the size of the remaining data.  If it is zero, break.
   if (dwDownloaded == 0)
    break;
  }
 }
}
  while(TRUE);
// Close the HINTERNET handle.
if (dwSizeSum!=sum);
InternetCloseHandle(hResource);
fclose(f);
// Set the cursor back to an arrow.
SetCursor(LoadCursor(NULL,IDC_ARROW));
// Return
return TRUE;
}



--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
TBD
Дата 22.2.2005, 03:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А ты пробывал не с narod.ru качать........а то у них перегруз вечно....и при загрузке БИНЫ портятся

  Вверх
maxim1000
Дата 22.2.2005, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



Цитата
Вот переделал, теперь загружает, но сохраняет нормально лишь txt, а все остальное doc, exe портит

наводит на мысль о текстовом/бинарном доступе к файлу, хотя не уверен


--------------------
qqq
PM WWW   Вверх
TBD
Дата 23.2.2005, 02:02 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А вот моно еще так...
Не идеал но всеже

#include <fstream.h>
#include <wininet.h>
#include <stdio.h>

#define BUF_SIZE 1024

BOOL Connect(char *url,char *fileName)
{
char *fname=fileName; //тут ченить
char heder[80];
HINTERNET hSession,hUrl;
unsigned long contlen;
unsigned long len;
char buf[BUF_SIZE];
unsigned long byter;
ofstream fs;


if(InternetAttemptConnect(0)!=ERROR_SUCCESS)
{
printf("IAC\n");
return false;
}
sprintf(heder,"Range:bytes=%d-",0);

hSession = InternetOpen("downloader",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
hUrl = InternetOpenUrl(hSession,url,heder,-1,INTERNET_FLAG_NO_CACHE_WRITE,0);
// hUrl = InternetOpenUrl(hSession,url,NULL,0,0,0);

if (hSession== NULL)
{
printf("Erro\n");
return false;
}
if (hUrl==NULL)
{
printf("hUrl\n");
return false;
}
len = sizeof contlen;

if(!HttpQueryInfo(hUrl,HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,&contlen,&len,NULL))
{
printf("Error Query\n");
return false;
}

fs.open(fname,ios::binary |ios::app|ios::app|ios::ate);


do
{
if (!InternetReadFile(hUrl,&buf,BUF_SIZE,&byter))
byter=-1;
fs.write(buf,byter);


}while(byter>0);


fs.close();
InternetCloseHandle(hUrl);
InternetCloseHandle(hSession);



return true;
}

  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0857 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.