Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

22.11.2007, 20:58

Dummes rumkopieren ^^

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <Wininet.h>
#include <string>
#include <vector>
#include <tchar.h>
#include <algorithm>

void read_url(std::basic_string<TCHAR> const& url, std::vector<unsigned char>& dest)
{
    dest.clear();
    ::HINTERNET hInternet(::InternetOpen(TEXT("Microsoft Internet Explorer"), INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0);
    if (hInternet == NULL) throw std::runtime_error("could not connect");
    
    ::HINTERNET hURL(::InternetOpenUrl(hInternet, url.c_str(), 0, 0, INTERNET_FLAG_RELOAD, 0);
    if (hURL == NULL)
    {
        ::CloseHandle(hInternet);
        throw std::runtime_error("invalid url");
    }

    unsigned char* tmp_arr = new unsigned char[128];
    DWORD read_bytes(0L);
    while (::InternetReadFile(hURL, tmp_arr, 128, &read_bytes) != FALSE)
    {
        if (read_bytes == 0L) break;
        dest.resize(dest.size() + read_bytes);
        std::copy(tmp_arr, tmp_arr + read_bytes, &dest[dest.size() - read_bytes - 1]);
    }
    delete [] tmp_arr;
    ::CloseHandle(hURL);
    ::CloseHandle(hInternet);
}  
... denke das sollte gehen ... nicht durchn compiler gejagt, wie immer :P

Nachtrag
Das Problem bei dem Code, von wem auch immer, war einfach, das du ja nur 256 Bytes reserviert hast. Das ist aber zu wenig für eine etwas komplexere Webseite oder irgendeiner anderen Datei aufm Server. Von daher hab ich ihn jetzt die Größe selbst herausfinden lassen und mal
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

12

23.11.2007, 19:18

uiii :shock: das beispiel v. nico scheint zu funzen :o coooool :D nur ein problem habsch noch (dann habsch hoffentlich alles kapiert :lol: ) : und zwar hat Nico das Teil ja als ne Konsolen-Anwendung geschriebselt (jedenfalls sieht's staaark danach aus). Aba das problem is einfach, dass ich ja mit Visual C++ dat Ding als Win32 brauche... naja und da is der quelltext ja scheinbar nochmal ein wenig anders... da ich mich jetzt nid so mit win32 auskenn (jedenfalls noch nid :p ) : wie sollte man den denn umschreiben, dass den auch Microsoft Visual C++ aktzeptiert? Also ich wöllte das dann z.B. in son TriBase-verwendendes Programm z.B. verwenden...

und bevor ichs vergesse: kann man dann mit den string variablen ganz normal umgehen? also sagen wa mal ich wöllte die dann in ne Message-Box reinhaun, ginge das dann so? :

C-/C++-Quelltext

1
2
MessageBox(NULL,"Das stand in der Webseite",Inhalt,MB_OK);
// angenommen Inhalt wäre d. Inhalt der Page als String (aba nich char)... xD

also kurz gesagt: könnte man STRING dann auch wie CHAR behandeln?

mfg

lol-man xD

p.s.: sry dassch euch hier so beanspruche :oops:

13

23.11.2007, 20:24

Ehm ja kannst du ... std::basic_string hat die Memberfunktion c_str(), die dir einen const _Elem* zurück gibt.

C-/C++-Quelltext

1
typedef basic_string<char> string;
=> c_str() gibt bei einem std::string ein const char* zurück.

C-/C++-Quelltext

1
::MessageBoxA(NULL, ReadUrl("http://www.google.de/").c_str(), "Inhalt von \"www.google.de\"", MB_OK | MB_ICONINFORMATION); 


Wobei der Code von Nico nen paar unschöne Scahen drin hat:
1. Stell mal den Zeichensatz auf UNICODE um.
2. const-correctness nicht beachtet.
3. Der String out wird nochmal kopiert, wenn du die Funktion verlässt.
4. Sehr unschönes Fehlerbehandeln.
5. ZeroMemory is bah.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

jojendersie

Frischling

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

14

23.11.2007, 23:39

Zitat

wie sollte man den denn umschreiben, dass den auch Microsoft Visual C++ aktzeptiert


Das Programm wird ohne weiteres in Microsoft Visual C++ compiliert, da es sich bei g++ um einen c++-Compiler in Linux handelt.

Damit das Programm nun keine Konsolenprogramm mehr ist, musst du wie bereits oben bei dir die WinMain benutzen und natürlich cout <<... austauschen.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCommandLine,
                   int iShowCommand)
{
   std::string a = ReadUrl(argv[1]);
   tbWriteToLog(a.c_str()); 
}

Nico

Frischling

Beiträge: 82

Wohnort: Nürnberg

  • Private Nachricht senden

15

24.11.2007, 10:29

Zitat


da es sich bei g++ um einen c++-Compiler in Linux handelt.

Nicht nur ;)

@Deviloper
Es ist nur ein schnell getipptes Beispiel bzw fixe Korrektur. :)
Aber warum ist ZeroMemory bah? Ist nix anderes als ein Makro das memset aufruft... Und das ist nunmal der schnellste Weg um ein Array zu nullen.
lg

16

24.11.2007, 10:51

Seh ich anders ... und jetzt überleg mal warum dann std::memset in Verbund mit C++ bäh ist ^^ (<cstring>).
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

17

24.11.2007, 12:15

Zitat von »"Deviloper"«

und jetzt überleg mal warum dann std::memset in Verbund mit C++ bäh ist


hm...ka^^

warum denn!?

wie würdest du ein array in C++ mit nullen füllen!?

18

24.11.2007, 13:29

Kommt darauf an, was das fürn Array ist ... mit POD-Typen geht es ... aber machs mal mit Klassen ...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

24.11.2007, 13:47

wie man sieht ist es ein char array...

Nico

Frischling

Beiträge: 82

Wohnort: Nürnberg

  • Private Nachricht senden

20

24.11.2007, 14:30

Also wenn du mir erklärst, wie man ein C-Style Array mit Nullen füllt, ohne memset und ohne Zeitverlust im vergleich mit memset() kriegst nen Keks :D
Es geht halt net anders... is aber nötig hier. Wenn nicht mehr ganz alle Bytes die angegeben sind gelesen werden, hast du dann hinten überhang. Alternative wäre den Bereich zu löschen und neu anzufordern, aber das is erst recht Blödsinn.
Aber viele Wege führen nach Rom ;).
lg

Werbeanzeige