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

1

21.11.2007, 19:16

Kleines Problem mit WinInet...

Huhu,

sry dass ich das frag is mir schon fast bissl peinlich :oops: aba ich komm da ned weiter... und zwar ist ja auf S. 821 im Buch was zu "Eine Webseite aus einem C++ Programm aufrufen" o.ä. erwähnt. Da wird ja dann diese Funktion angeboten:

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
int ReadURL(char* pcURL,
            BYTE* pData)
{
    HINTERNET hInternet = InternetOpen("Microsoft Internet Explorer",
                                        INTERNET_OPEN_TYPE_PRECONFIG,
                                        0,0,0);
    if(!hInternet) return -1;

    HINTERNET hURL = InternetOpenUrl(hInternet,pcURL,0,0,INTERNET_FLAG_RELOAD,0);

    if(!hURL)
    {
        CloseHandle(hInternet);
        return -1;
    }

    DWORD dwNumBytesRead;
    BYTE* pCursor = pData;
    do
    {
        InternetReadFile(hURL,pCursor,50,&dwNumBytesRead);
        pCursor += dwNumBytesRead;
    } while (dwNumBytesRead);
    CloseHandle(hURL);
    CloseHandle(hInternet);

    return (int) (dwNumBytesRead);
}


so und nun meine frage xD ich kenn mich mit dem Typ BYTE nid so ganz aus... kann man den wie ne char variable verwenden? was müsste man denn schreiben, wenn man den Quellcode der URL (z.B. "www.die-seite.de") in ne variable x reinschieben will und den z.B. in ne Log-Datei (per tbWriteToLog) schreiben will?

sry dassch so ne einfache frage stell, aba ich hab da gerade irgendwie nen hänger... Oo

mfg

lol-man

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

2

21.11.2007, 20:36

Also soweit ich weiß ist BYTE im prinzip ein char ( unsigned char):

C-/C++-Quelltext

1
typedef unsigned char    BYTE


Aber wiso David dort BYTE genommen hat ... ka...

Nico

Frischling

Beiträge: 82

Wohnort: Nürnberg

  • Private Nachricht senden

3

21.11.2007, 21:49

C-/C++-Quelltext

1
int ReadURL(char* pcURL, BYTE* pData) ;


Is doch einfach:

C-/C++-Quelltext

1
2
3
BYTE *pBuffer = new BYTE[256];
int read = ReadUrl("www.die-seite.de", pBuffer);
delete pBuffer;


pBuffer enthält nun die Daten, die auf der Webseite zu lesen waren.
Allerdings ist diese Funktion nicht dazu gedacht komplexe Webseiten zu lesen, sondern um einzelne Zahlen etc aus dem Web zu lesen um eine Versionskontrolle o.ä. durchzuführen IIRC.
Und nein, es ist keine einfache Variable, sondern ein Zeiger, das wird durch den * angezeigt. Das heisst, du musst einen Zeiger auf einen gültigen Speicherbereich übergeben.
lg

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

4

21.11.2007, 22:04

Warum BYTE* und nicht einfach char*?
:arrow: ich kann nur vermuten, dass es damit zusammenhängt, dass die Website nunmal nicht zwangsläufig ANSI-kodiert ist und somit ein char* im Quellcode zu falschen Rückschlüssen verleiten würde.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

21.11.2007, 23:06

Zitat von »"Nico"«


Is doch einfach:

C-/C++-Quelltext

1
2
3
BYTE *pBuffer = new BYTE[256];
int read = ReadUrl("www.die-seite.de", pBuffer);
delete pBuffer;



Merke: Zu jedem new[] gehört ein delete[]! :idea:
@D13_Dreinig

Nico

Frischling

Beiträge: 82

Wohnort: Nürnberg

  • Private Nachricht senden

6

21.11.2007, 23:41

Tippfehler :D Aber recht haste.^^
lg

7

22.11.2007, 15:33

Hmm... danke erstmal soweit :D jedenfalls compilt er mittlerweile die Funktion problemlos (habe jetzt euren Vorschlag hinzugefügt). Doch wenn er fertig mit compilen is und ausführt, gibt's nen Error Oo Ich zitiere:

Zitat

Eine Ausnahme (erste Chance) bei 0x778f0f0f in Texte.exe: 0xC0000008: An invalid handle was specified.
<- ich kann nid viel damit anfangen... :?

Ich präsentier mal das tolle Beispielprogramm (is stark gekürtzt... :) ):

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// DAS

// PROGRAMM

// MIT DEM ERROR! xD

//

#include "TriBase.h"
#include "wininet.h"

int ReadUrl(char* pcURL, 
            BYTE* pData) 
{ 

    HINTERNET hInternet = InternetOpen("Microsoft Internet Explorer", 
                                        INTERNET_OPEN_TYPE_PRECONFIG, 
                                        0,0,0); 
    if(!hInternet) return -1; 

    HINTERNET hURL = InternetOpenUrl(hInternet,pcURL,0,0,INTERNET_FLAG_RELOAD,0); 

    if(!hURL) 
    { 
        CloseHandle(hInternet); 
        return -1; 
    } 

    DWORD dwNumBytesRead; 
    BYTE* pCursor = pData; 
    do 
    { 
        InternetReadFile(hURL,pCursor,50,&dwNumBytesRead); 
        pCursor += dwNumBytesRead; 
    } while (dwNumBytesRead); 
    CloseHandle(hURL); 
    CloseHandle(hInternet); 

    return (int) (dwNumBytesRead); 
}






// Windows-Hauptfunktion

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCommandLine,
                   int iShowCommand)
{
tbInit();

BYTE *pBuffer = new BYTE[256]; 
int read = ReadUrl("http://www.google.de", pBuffer); 
delete pBuffer; 

tbExit();

return 0;

}


Woran könnte das liegen? xD Ich hab als url Google genommen weil ich den Spaß ja nur mal testen wollte... is mir schon klar, dass man damit eig. andere Seiten mit nur Versionsdaten o.ä. lädt, aba sollte ja nurn test werden. Wenn ich aba das Codeschnippsel...

C-/C++-Quelltext

1
2
3
BYTE *pBuffer = new BYTE[256]; 
int read = ReadUrl("http://www.google.de", pBuffer); 
delete pBuffer; 

... herausnehme geht's... (also das Programm ohne wirklichen Inhalt wird dann korekt ausgeführt.)

Please help!

p.s.: hab natürlich die datei wininet.lib schon hinzugefügt... und daaanke leude für eure bisherige hilfe :)

Databyte

Alter Hase

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

8

22.11.2007, 15:41

Wie oben schon gesagt muss es:

C-/C++-Quelltext

1
delete[] pBuffer;


heißen

ps: denke jedenfalls das es daran liegt

9

22.11.2007, 19:00

hmm... habs geändert, aba bringt nid wirklich was :( (kommt gleicher error...) weiß sonst vllt. eina nen link für so nen Script? xD aba danke trotzdem für die hilfe bisher :D

Nico

Frischling

Beiträge: 82

Wohnort: Nürnberg

  • Private Nachricht senden

10

22.11.2007, 19:39

Habs mal ein wenig umgeschrieben ;)

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
32
33
34
35
36
37
38
39
40
41
42
43
#include <windows.h>
#include <wininet.h>
#include <iostream>
#include <string>

std::string ReadUrl(char* pcURL)
{
    std::string out = " ";
    HINTERNET hInternet = InternetOpen("Microsoft Internet Explorer",
                                        INTERNET_OPEN_TYPE_PRECONFIG,
                                        0,0,0);
    if(!hInternet) return std::string("error1");

    HINTERNET hURL = InternetOpenUrl(hInternet,pcURL,0,0,INTERNET_FLAG_RELOAD,0);

    if(!hURL)
    {
        CloseHandle(hInternet);
        return std::string("error2");
    }

    DWORD dwNumBytesRead;
    char* pCursor = new char[128];
    do
    {
        InternetReadFile(hURL,pCursor,128,&dwNumBytesRead);
        //pCursor += dwNumBytesRead;        

        out.append(pCursor);
        ZeroMemory(pCursor, sizeof(pCursor));
    } while (dwNumBytesRead);
    delete [] pCursor;
    CloseHandle(hURL);
    CloseHandle(hInternet);

    //return (int) (dwNumBytesRead);

    return out;
}

int main(int argc, char** argv)
{
   std::string a = ReadUrl(argv[1]);
   std::cout << a << std::endl;
}

So funzts... komischerweise hat hier irgendwie das Speichermanagement nicht hingehauen. Wenn man sich den Original-Code etwas ansieht, dann sieht man, dass nirgends Speicher angefordert wird, InternetReadFile() tut das aber auch nicht. Ausserdem wird pCursor mit jedem Aufruf in der Schleife inkrementiert. Es findet aber nirgends ein Größen-Abgleich statt. Das ist aber genau das, was ich eingangs sagte, dieser Code erwartet einfach, dass wir die Größe des Outputs kennen, weil die Seite ja vom Programmierer angelegt wurde, für Versionskontrolle.
Das is jetzt quasi ein Workaround und man kann alle Seiten aufrufen.

Quellcode

1
2
3
4
5
6
7
// Kompiliert mit:
g++ ReadUrl.cpp -lwininet --ansi -o ReadUrl.exe
0 Warnungen, 0 Fehler
//Verwendung:
ReadUrl.exe http://google.de
//Verwendung, mit Output in eine Datei:
ReadUrl.exe http://google.de > out.txt

lg

Werbeanzeige