Turbo C++ i WWW

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Turbo C++ i WWW

Nowy postprzez GoldWolf » wtorek, 22 września 2009, 19:01

Witam, chciałem zapytać czy jakiś komponent z dostępnych na palecie umożliwia ściągniecie zawartości strony do aplikacji.
Do tej pory używałem dodatkowej aplikacji opartej o curl. Chciałbym jednak spróbować czegoś innego. Niestety w turbo nie możliwe jest dodawanie komponentów.
Obrazek

Przez ściągniecie zawartości strony - rozumiem tekst umieszczony na stronach.

PS czy tak przypadkiem nie mógłbym wykorzystać - bibliotekę urlmon.h ?
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez Cyfrowy Baron » wtorek, 22 września 2009, 19:52


Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
GoldWolf
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez GoldWolf » czwartek, 24 września 2009, 19:48

Cyfrowy Baron napisał(a):Proponuję przeczytać ten post: http://programowanie.cal.pl/forum/viewtopic.php?f=16&t=527

Czytałem ten artykuł ale jakoś do głowy mi nie przyszło, że może się przydać.

Próbuję wykorzystać wininet, pytanie dlaczego miałem takie błędy?
[Linker Error] Error: Unresolved external 'InternetOpenA' referenced from C:\DOCUMENTS AND SETTINGS\TEST\MOJE DOKUMENTY\BORLAND STUDIO PROJECTS\DEBUG_BUILD\UNIT4.OBJ
[Linker Error] Error: Unresolved external 'InternetConnectA' referenced from C:\DOCUMENTS AND SETTINGS\TEST\MOJE DOKUMENTY\BORLAND STUDIO PROJECTS\DEBUG_BUILD\UNIT4.OBJ

I musiałem zastosować zapis #pragma link "wininet.lib", pomimo, że plik #include <wininet.hpp>, znajduje się w katalogu co #include <vcl.h>(czyli C:\Program Files\Borland\BDS\4.0\include\vcl).

Wiem, że na MSDN pisze o:
Requirements:
Minimum supported client Windows 2000 Professional
Minimum supported server Windows 2000 Server
Version Internet Explorer 3.0 or later
Header Wininet.h
Library Wininet.lib
DLL Wininet.dll

Ale dlaczego kompilator nie wiedział gdzie szukać?
Inaczej mówiąc, dlaczego muszę zastosować zapis #pragma link "wininet.lib", a nie muszę #pragma link "vcl.lib".
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez Cyfrowy Baron » czwartek, 24 września 2009, 20:39

Bibliotekę wininet.lib trzeba dołączać niezależnie od dołączonych plików nagłówkowych, gdyż korzystasz z biblioteki wininet.DLL, która znajduje się w katalogu C:\Windows\System32. Bez pliku *.LIB program nie może się połączyć z tą biblioteką.

Jeżeli chcesz lepiej to zrozumieć, to proponuję przeczytać artykuł: ► patrz serwis: Cyfrowy Baron dział: teoria -> tworzenie DLL.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez GoldWolf » środa, 30 września 2009, 19:51

Z biblioteką wininet pobieranie stron nie jest złe:
Kod: Zaznacz cały
std::string m_strURL = "http://cyfbar.republika.pl/";
HINTERNET Sesja;
Sesja = InternetOpen("Moja sesja", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(Sesja !=  NULL)
{
   HINTERNET Serwis;
   Serwis = InternetOpenUrl(Sesja, m_strURL.c_str(), NULL, 0, 0, 0);
   if(Serwis != NULL){
      DWORD dwBytesRead;
      char cRead[100000];

      InternetReadFile(Serwis, cRead, 100000, &dwBytesRead);
      InternetCloseHandle(Serwis);

      std::string str = cRead;
      Memo1->Text = cRead;
      Memo1->Lines->Add(str.length());
   }else
      Memo1->Lines->Add("Błąd");

   InternetCloseHandle(Sesja);
}

Jedynym minusem jest to, że nie wiemy ile potrzeba nam miejsca na ściągnięcie strony czyli parametr char cRead[100000];.
Stronka cyfrowego zawiera 23593 bajtów, ale onet już 97287. To ile wczytam określa nam 3 parametr InternetReadFile(Serwis, cRead, 100000, &dwBytesRead);

PS jedno pytanie czy może ktoś się domyśla dlaczego strona http://www.benchmark.pl/phpBB3/index.php - wczytuje się cała a strona index.php już nie wczytuje od 1000 do 6000, ale nie pobiera całej ?
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez Cyfrowy Baron » środa, 30 września 2009, 21:15

PS jedno pytanie czy może ktoś się domyśla dlaczego strona http://www.benchmark.pl/phpBB3/index.php - wczytuje się cała a strona index.php już nie wczytuje od 1000 do 6000, ale nie pobiera całej ?


Ponieważ zaprezentowana funkcja ściąga konkretne pliki, a nie strony sieci WEB. Jeżeli jakaś strona główna PHP (niekoniecznie główna, to tylko przykład) ma zagnieżdżoną w sobie inną stronę, to przeglądarka oczywiście wyświetli taką zagnieżdżoną stronę w stronie głównej, jednak funkcja pobierze tylko plik który wskazałeś.

Zmylić może ten zapis: std::string m_strURL = "http://cyfbar.republika.pl/";

jednakże w takim przypadki funkcja szuka domyślnie (podobnie jak przeglądarka) strony index.html



Co do rozmiaru bufora to wystarczy drobna modyfikacja:

Kod: Zaznacz cały
#include <string.h>
#include <stdlib.h>

// [...]
char   szSizeBuffer[32]; 
DWORD   dwLengthSizeBuffer   =   sizeof(szSizeBuffer);   
DWORD   dwFileSize; 
DWORD   dwBytesRead; 
CString   Contents;   

HttpQueryInfo(Servis, HTTP_QUERY_CONTENT_LENGTH,   szSizeBuffer,   &dwLengthSizeBuffer,   NULL)   ; 

dwFileSize = atol(szSizeBuffer); 
LPSTR   szContents   =   Contents.GetBuffer(dwFileSize); 
   
InternetReadFile(Servis,   szContents,   dwFileSize,   &dwBytesRead);   

// [...]


I jeszcze jedno:

zamiast:std::string m_strURL = "http://cyfbar.republika.pl/";

możesz użyć:String_strURL = "http://cyfbar.republika.pl/";

nie będziesz potrzebował biblioteki <string>.
Możesz też użyć zmiennej typu char, wtedy nie trzeba stosować konwersji m_strURL.c_Str()
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez GoldWolf » czwartek, 1 października 2009, 17:58

Taki kod mi się nie kompiluje:
Kod: Zaznacz cały
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <string.h>
#include <stdlib.h>
#include "Unit3.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormCreate(TObject *Sender){

char   szSizeBuffer[32];
DWORD   dwLengthSizeBuffer   =   sizeof(szSizeBuffer);   
DWORD   dwFileSize;
DWORD   dwBytesRead;
CString   Contents;
}
//---------------------------------------------------------------------------
[C++ Error] Unit3.cpp(24): E2451 Undefined symbol 'CString'.

Jak udało mi się dowiedzieć "CString jest MFC'owe (Visual C++ Enterprise)", więc jakaś drobna pomyłka?
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez polymorphism » czwartek, 1 października 2009, 18:33

CString to klasa z MFC, więc chyba lepiej użyj std::string'a, tak jak miałeś przedtem.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez Cyfrowy Baron » czwartek, 1 października 2009, 19:21

Błąd wywołuje zmienna CString. Kod pisałem z pamięci, i szczerze mówiąc od godziny próbuję użyć tego typu, ale nic mi z tego nie wychodzi, dlatego podaję kod z nieco innym rozwiązaniem:

Kod: Zaznacz cały
  char   szSizeBuffer[32];
  DWORD   dwLengthSizeBuffer   =   sizeof(szSizeBuffer);
  DWORD   dwFileSize;
  DWORD   dwBytesRead;

  String m_strURL = "http://cyfbar.republika.pl/";
  HINTERNET Sesja;
  Sesja = InternetOpen(Application->Name.c_str(), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
  if(Sesja !=  NULL)
  {
    HINTERNET Serwis;
    Serwis = InternetOpenUrl(Sesja, m_strURL.c_str(), NULL, 0, 0, 0);
    if(Serwis != NULL)
    {
      HttpQueryInfo(Serwis, HTTP_QUERY_CONTENT_LENGTH,   szSizeBuffer,   &dwLengthSizeBuffer,   NULL)   ;

     dwFileSize = atol(szSizeBuffer);

     LPSTR cRead = new char[dwFileSize];
   
     InternetReadFile(Serwis,   cRead,   dwFileSize,   &dwBytesRead);

    InternetCloseHandle(Serwis);

    String str = (LPSTR)cRead;
    Memo1->Text = (LPSTR)cRead;
    Memo1->Lines->Add(str.Length());
  }
  else  Memo1->Lines->Add("Błąd");

  InternetCloseHandle(Sesja);
}


Ten fragment kodu:

Kod: Zaznacz cały
     LPSTR cRead = new char[dwFileSize];


jakoś mi tak nie pasuje, mimo iż działa.
Można by też tak:

Kod: Zaznacz cały
     void *cRead = new char[dwFileSize];


ale wtedy trzeba też zmienić nieco ten kod:

Kod: Zaznacz cały
   String str        = (LPSTR)cRead;
   Memo1->Text = (LPSTR)cRead;


Niech się może ktoś inny jeszcze wypowie, który sposób lepszy.



std::string nie da się zastosować zamiast CString, możesz sprawdzić jeżeli nie wierzysz.

Jak zauważysz w kodzie wogóle zrezygnowałem ze zmiennych typu string zastępując je typem String:

tu: String m_strURL = "http://cyfbar.republika.pl/";
i tu: String str = cRead;

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
GoldWolf
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez GoldWolf » czwartek, 1 października 2009, 19:44

Jak zauważysz w kodzie wogóle zrezygnowałem ze zmiennych typu string zastępując je typem String:

tu: String m_strURL = "http://cyfbar.republika.pl/";
i tu: String str = cRead;
Akurat tutaj faktycznie nie jest mi ta zmienna potrzebna. Jednak i tak to co ściągnę z netu muszę ostatecznie zamienić na stringa, ponieważ potrzebuje jego metody(.find(),.assign()). Też siedziałem nad tym 2h i doszedłem do wniosku, że jest pomyłka.

Czy w kwestii stron ....indeks.php można coś zrobić ?

Jednak jest jeden problem gdy użyję twojego rozwiązania w/w strona benchmark nie zawsze się wczyta.
Kod: Zaznacz cały
//std::string m_strURL = "http://www.bet-at-home.com/odd.aspx?action=toggleEventGroup&SportID=1&EventGroupID=181";
std::string m_strURL = "http://programowanie.cal.pl/forum/index.php";
      m_strURL =    "http://www.benchmark.pl/phpBB3/index.php";
//      m_strURL =    "http://onet.pl";

char   szSizeBuffer[32];
DWORD   dwLengthSizeBuffer   =   sizeof(szSizeBuffer);
DWORD   dwFileSize;
DWORD   dwBytesRead;

HINTERNET Sesja;
Sesja = InternetOpen("Moja sesja", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(Sesja !=  NULL)
{
   HINTERNET Serwis;
   Serwis = InternetOpenUrl(Sesja, m_strURL.c_str(), NULL, 0, 0, 0);
   HttpQueryInfo(Serwis, HTTP_QUERY_CONTENT_LENGTH,   szSizeBuffer,   &dwLengthSizeBuffer,   NULL)   ;

   dwFileSize = atol(szSizeBuffer);

   //InternetReadFile(Servis,   szContents,   dwFileSize,   &dwBytesRead);
   if(Serwis != NULL){
   //   DWORD dwBytesRead;
      LPSTR cRead = new char [dwFileSize];
//      char cRead[100000];

      InternetReadFile(Serwis, cRead,   dwFileSize,   &dwBytesRead);
//      InternetReadFile(Serwis, cRead,   100000,   &dwBytesRead);
      InternetCloseHandle(Serwis);

//      std::string str = cRead;
      Memo1->Text = cRead;
//      Memo1->Lines->Add(str.length());
//      UsuwajTagi(str);
   }else
      Memo1->Lines->Add("Błąd");

   InternetCloseHandle(Sesja);
}

Odpal kilka razy program to się przekonasz. Jeśli jest statycznie podane do zawszę się wczyta.
Przyczyną jest rozwiązanie:
Kod: Zaznacz cały
HttpQueryInfo(Serwis, HTTP_QUERY_CONTENT_LENGTH,   szSizeBuffer,   &dwLengthSizeBuffer,   NULL)   ;
   dwFileSize = atol(szSizeBuffer);
   Memo1->Text = dwFileSize;
Wartość dwFileSize; często wynosi 0.

Moje tymczasowe rozwiązanie to:
Kod: Zaznacz cały
   if (HttpQueryInfo(Serwis, HTTP_QUERY_CONTENT_LENGTH,   szSizeBuffer,   &dwLengthSizeBuffer,   NULL) )
      dwFileSize = atol(szSizeBuffer);
   else
      return;
No i oczywiście wszystko by musiało być w pętli by tak długo próbował, aż się uda.

PS zapomniałem dodać, iż chodzi o strony oparte na php, onet wchodzi przez problemu zawsze za pierwszym razem
Ostatnio edytowano czwartek, 1 października 2009, 20:25 przez GoldWolf, łącznie edytowano 1 raz
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez GoldWolf » czwartek, 1 października 2009, 20:22

Cyfrowy Baron napisał(a):Ten fragment kodu:
Kod: Zaznacz cały
     LPSTR cRead = new char[dwFileSize];
jakoś mi tak nie pasuje, mimo iż działa.
Można by też tak:
Kod: Zaznacz cały
     void *cRead = new char[dwFileSize];


ale wtedy trzeba też zmienić nieco ten kod:

Kod: Zaznacz cały
   String str        = (LPSTR)cRead;
   Memo1->Text = (LPSTR)cRead;

Niech się może ktoś inny jeszcze wypowie, który sposób lepszy.

Akurat nie wiem, który lepszy ale o ile się nie mylę to wytwór MS. Znajomy trochę mi go rozszyfrował:
LP -> wskaźnik STR -> string
czyli typedef char* LPSTR;
typedef const char* LPCSTR;
typedef TCHAR* LPTSTR;
typefef const TCHAR* LPCTSTR;
typedef WCHAR* LPWSTR;
typedef const WCHAR* LPCWSTR;

Czyli zapis (LPSTR cRead = new char[dwFileSize]) = (char * cRead = new char[dwFileSize] )
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez Cyfrowy Baron » czwartek, 1 października 2009, 21:17

Sprawdź jeszcze poradę: ► patrz serwis: Cyfrowy Baron dział: porady -> sieć - internet -> Ściąganie plików z Internetu przez protokół HTTP (bez Indy).

Co do tego rozmiaru bufora, to problem dotyczy plików z rozszerzeniem PHP. Po drobnych modyfikacjach kod zaczyna działać prawidłowo:

Kod: Zaznacz cały
DWORD   szSizeBuffer;
DWORD   dwLengthSizeBuffer = 32;
DWORD   dwBytesRead;

String m_strURL = "http://programowanie.cal.pl/forum/index.php";
HINTERNET Sesja;
Sesja = InternetOpen(Application->Name.c_str(), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if(Sesja !=  NULL)
{
  HINTERNET Serwis;
  Serwis = InternetOpenUrl(Sesja, m_strURL.c_str(), NULL, 0, 0, 0);
  if(Serwis != NULL)
  {
   if(!HttpQueryInfo( Serwis, HTTP_QUERY_CONTENT_LENGTH,   (LPVOID)szSizeBuffer,   &dwLengthSizeBuffer,   NULL))
   {
    void *cRead = new char[szSizeBuffer];
    InternetReadFile(Serwis,   cRead,   szSizeBuffer,   &dwBytesRead);
    String str = (LPSTR)cRead;
    Memo1->Text = (LPSTR)cRead;
    Memo1->Lines->Add(str.Length());
    delete cRead;
   }
  }else Memo1->Lines->Add("Błąd");

  InternetCloseHandle(Sesja);
}


Odpal kilka razy program to się przekonasz.


Pomiędzy kolejnymi wczytaniami pliku musi nastąpić kilkusekundowa przerwa około 5 sekund.

Jeśli jest statycznie podane do zawszę się wczyta.


Przy jawne zdefiniowanym rozmiarze bufora nie wywołujesz funkcji HttpQueryInfo sprawdzającej rozmiar pliku, masz natomiast zdefiniowany rozmiar bufora, dlatego wczytuje cały plik. Problemem nie jest wczytywanie pliku. lecz sprawdzanie jego rozmiaru.
Niestety nie znam sposobu na rozwiązanie problemu z błędem w pobieraniu rozmiaru pliku.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
GoldWolf
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez polymorphism » piątek, 2 października 2009, 11:24

Panowie kombinują jak koń pod górę:
Kod: Zaznacz cały
char      buffer[1024];
DWORD      cb_read = 0;
ofstream   ofs("text.html",ofstream::binary);

while(InternetReadFile(Serwis,buffer,1024,&cb_read) && cb_read > 0)
{
   ofs.write(buffer,cb_read);
}

Opcja z HttpQueryInfo jest o tyle niepewna, że nagłówki HTTP nie muszą zawierać informacji o rozmiarze danych.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez Cyfrowy Baron » piątek, 2 października 2009, 13:56

Jak widać, nie czytasz uważnie. To co Ty przedstawiłeś, to Dante opracował sam na początku.
Nam chodziło o to, żeby nie definiować jawnie rozmiaru bufora, co Ty zrobiłeś:

char buffer[1024];


Lecz by dynamicznie dobierać rozmiar bufora w zależności od rozmiaru pliku i do tego właśnie potrzebna jest funkcja HttpQueryInfo.

To co Ty zaproponowałeś to niemalże to samo co w pierwszym poście podał Dante.

DWORD dwBytesRead;
char cRead[100000];

if( InternetReadFile(Serwis, cRead, 100000, &dwBytesRead) )
{



Z plikami HTML nie ma najmniejszego problemu, dynamiczne dobieranie rozmiaru bufora za pomocą funkcji HttpQueryInfo działa poprawnie.

Co do klasy ofsteram, to można się tutaj równie dobrze posłużyć klasą TStringList.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Turbo C++ i WWW

Nowy postprzez polymorphism » piątek, 2 października 2009, 14:26

Jak widać, nie czytasz uważnie. To co Ty przedstawiłeś, to Dante opracował sam na początku.

Nigdzie nie widzę tego. Zresztą jakby opracował od początku to nie byłoby tematu niekompletnego ściągania zawartości www. To co zaproponowałem działa zawsze ze stroną, która sprawiała problem.

To co Ty zaproponowałeś to niemalże to samo co w pierwszym poście podał Dante

Zarzucasz mi, że nie czytam uważnie a sam w tym temacie nie jesteś lepszy 8-) Tam jest pętla while, a nie warunek if, jak w kodzie Dantego. Czyli w pętli czytam całą stronę, kawałkami po 1024 bajty, do momentu gdy funkcja zwróci błąd lub przeczyta 0 bajtów. Dodatkowo pozbyłem się alokacji, która w waszym kodzie powoduje wyciek ;)

Co do klasy ofsteram, to można się tutaj równie dobrze posłużyć klasą TStringList.

Można, tylko po co? Zamiast ofstream można użyć ostringstream lub od razu string'a, bo chyba w nim Dante chciał mieć załadowaną zawartość. Uczyć się STL-a!
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 2 gości