Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2014, 21:03   #1
FULEREN
Пользователь
 
Регистрация: 23.03.2012
Сообщений: 56
По умолчанию Проблема с InternetReadFile.

Доброго времени суток форумчане. Хочу скачать на диск html страничку, но никак не получается. Качаю так:
Код:
do {
InternetReadFile(hInternetOpenUrl, Memory, 1024, &dwCountReadUrl);
} while (dwCountReadUrl != 0);
В итоге получаю на выходе недокаченную страницу (или непонятный кусок страницы). Помогите разобраться, как все таки нужно юзать данную функцию? Заранее благодарю.
FULEREN вне форума Ответить с цитированием
Старый 20.12.2014, 21:15   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а буфер кто будет смещать или сбрасывать?
вы пишете 1024 байта в одно и тоже место, стирая то что там было ранее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.12.2014, 21:30   #3
FULEREN
Пользователь
 
Регистрация: 23.03.2012
Сообщений: 56
По умолчанию

Пепел Феникса, вас понял, но компилятор ругается на такую конструкцию:
Код:
int i = 0;
do {
  InternetReadFile(hInternetOpenUrl, Memory[i], 1, &dwCountReadUrl);
  i++;
} while (dwCountReadUrl != 0);
Я только начал постигать С, по этому туплю...
FULEREN вне форума Ответить с цитированием
Старый 20.12.2014, 22:06   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Зачем буфер смещать?
Вопрос скорее где и как пишете в файл, а то в вашем примере этого нет.
waleri вне форума Ответить с цитированием
Старый 20.12.2014, 22:11   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
компилятор ругается
Что, и тебя не научили?
Ай яй... Какое коварное образование на постсоветском пространстве.
Ладно, не буду мучать, скажу открытым текстом: Текст ругани в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.12.2014, 22:11   #6
FULEREN
Пользователь
 
Регистрация: 23.03.2012
Сообщений: 56
По умолчанию

Вот полный код программы. Сильно не пинайте, знаю он кривой...
Код:
#include <wininet.h>

HANDLE hHeap;
char * Memory;
void CreateMemory();
void DestroyMemory();

void Main(){
  DWORD dwCountReadUrl;
  DWORD dwCount;

  CreateMemory();
  HANDLE hInternetOpen = InternetOpen("Mozilla/5.0 (Windows NT 6.2; rv:34.0) Gecko/20100101 Firefox/34.0", 1, 0, 0, 0);
  HANDLE hInternetOpenUrl = InternetOpenUrl(hInternetOpen, "http://google.ru", 0, 0, INTERNET_FLAG_NO_CACHE_WRITE, 0);
    
  do {
  InternetReadFile(hInternetOpenUrl, Memory, 1024, &dwCountReadUrl);
  } while (dwCountReadUrl != 0);

  Sleep(5000);
  HANDLE hFile = CreateFile("page.html", GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
  WriteFile(hFile, Memory, lstrlen(Memory), &dwCount, 0);
  CloseHandle(hFile);
  InternetCloseHandle(hInternetOpenUrl);
  InternetCloseHandle(hInternetOpen);
  DestroyMemory();
  ExitProcess(0);
}

void CreateMemory(){
  hHeap = HeapCreate(0, 0x0100000, 0);		
  Memory = (char *)HeapAlloc(hHeap, HEAP_NO_SERIALIZE, 0x0100000);
}


void DestroyMemory(){
  HeapFree(hHeap, HEAP_NO_SERIALIZE, Memory);
  HeapDestroy(hHeap);	
}

Последний раз редактировалось FULEREN; 20.12.2014 в 22:14. Причина: Убрал функции для работы с консолькой.
FULEREN вне форума Ответить с цитированием
Старый 21.12.2014, 10:41   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Все правильно, в файл записывается только последний кусок страницы.

Создание файла надо перенести до цикла а саму запись в файл - внутрь цикла.
waleri вне форума Ответить с цитированием
Старый 21.12.2014, 10:56   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот пример писал для журнала:
Код:
	// процедура потока
	static void Load(){
		// Возможный код ошибок
		int err=0;
		// Переменки сессии, запроса и коннекта
		HINTERNET hSession,hConnect,hRequest;
		//Открываем окошко в интернет
		hSession=InternetOpen(L"А мы тут плюшками балуемся :)",INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
		// Если это удалось
		if(hSession){
			//***********************************************
				// Падаем на хвост порталу, с которого качать страничку нужно
				hConnect=InternetConnectA(hSession,(LPCSTR)Loader->_url,
					INTERNET_DEFAULT_HTTP_PORT, 0, 0, INTERNET_SERVICE_HTTP, 0, 1);
				// Если портал не против
				if(hConnect){
					//************************************	***
						// Формируем просьбу выдать страницу.
						hRequest = HttpOpenRequest(hConnect,L"GET",L"", HTTP_VERSION, 0,0,INTERNET_FLAG_KEEP_CONNECTION, 1);
						// Коль скоро и это нам позволено
						if(hRequest){
							//*******************************
							//Отправляем депешу порталу в надежде на лучшее
							// Если портал не против дружить это хорошо :)
							if (HttpSendRequest(hRequest,0,0,0,0)){
								DWORD Size=0;
								// Выясняем по сколько портал нам будет высылать байт в очередной порции
								InternetQueryDataAvailable(hRequest,&Size,0,0);
								// и поехали...
								for(;Size;){
									// зарезервируем массив байт для очередной порции
									char *s=new char[Size];
									// эта переменка будет получать число считанных байт
									DWORD nbr=0;
									// Если считывание удается
									if (!InternetReadFile(hRequest,s,Size,&nbr)) break;
									// То сгенерируем событие, передав ему строку с очередной порцией
									Loader->LetMePart(s,nbr);
									// После чего строку освобождаем
									delete[] s;
									// и выясняем как там со следующей порцией
									InternetQueryDataAvailable(hRequest,&Size,0,0);
								}
							} else {
								// если произошла ошибка получить ее код
								err=GetLastError();
//								LastError();
							}
							//*******************************
							// И позакрывать запрос
							InternetCloseHandle(hRequest);
						}
					//***************************************
					//... Связку
					InternetCloseHandle(hConnect);
				}
			//***********************************************
			//... и сессию, отключившись от интернета
			InternetCloseHandle(hSession);
		}
		// после чего сгенерировать событие завершения
		Loader->AfterDownload();
		// и благополучно покинуть доппоток
		return;
	}
Вместо Loader->LetMePart(s,nbr); пиши запись в файл из массива s кол-вом Size
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
InternetReadFile не читает архивы questy Win Api 3 24.08.2013 11:03
Неблокирующий сокет Си проблема с закрытием, проблема с закрытием сокетов в цикле mnx_vol C/C++ Сетевое программирование 0 06.11.2012 13:57
InternetReadFile - проблемы с кодировками Gtx541 Win Api 2 07.06.2010 13:36
Проблема с рамами/Проблема с ЖД DRAGGER Компьютерное железо 6 04.01.2009 23:37