Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: nettisivun lähdekoodin hakeminen

Tumettaja [06.02.2009 15:55:27]

#

Morjens.

Käytän erästä ohjelmaa, jossa ei ole sisäänrakennettuna funktiota, jolla pääsisi käsiksi nettisivun lähdekoodiin. Ohjelma osaa kuitenkin käyttää ulkoisia .dll tiedostoja, joten päätin etsiä netistä c++ pätkän joka hoitaisi homman. Kääntäjän toimii Dev-C++, ja se kääntääkin koodini ilman herjoja, mutta kun käytän käännettyä .dll tiedostoa ohjelmani kanssa, ohjelma vain kaatuu. Kysynkin, onko tässä koodissa jotain vialla?

#include "dll.h"
#include <wininet.h>
#include <windef.h>
#define export extern "C" __declspec( dllexport )

export char* showSource() {
   char* buffer;
   HINTERNET hINet, hFile;
   hINet = InternetOpen("InetURL/1.0", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
   if ( !hINet )
         {
         // bail out
         }
   hFile = InternetOpenUrl( hINet, "http://www.google.fi", NULL, 0, 0, 0 );
   if ( hFile )
      {
      DWORD dwRead;
      InternetReadFile( hFile, buffer, 1023, &dwRead);
      InternetCloseHandle( hFile );
      }
   InternetCloseHandle( hINet );
   return buffer;
}

Metabolix [06.02.2009 16:33:23]

#

On vikaa. Et alusta buffer-osoitinta lainkaan, jolloin data menee muistissa johonkin satunnaiseen kohtaan (ts. ei mene, kun ohjelma kaatuu siihen). Muutenkin tuossa lukisit vain ensimmäiset 1023 tavua.

Kokeile tällaista funktiota vastaavan WinAPI-funktion tilalle:

std::string My_InternetReadFile(HINTERNET hFile) {
  std::string data;
  DWORD dwRead;
  char buf[1024];
  while (InternetReadFile(hFile, buf, sizeof(buf), &dwRead) != TRUE || dwRead > 0) {
    data += std::string(buf, dwRead);
  }
  return data;
}

Funktion palauttamasta C++:n string-oliosta voit sitten kopioida tekstin erikseen varaamallesi muistialueelle. Muista selvittää, millä tavalla käyttämäsi ohjelma huolehtii muistin vapauttamisesta, ja varaa muistialue sen mukaan malloc-funktiolla tai new-operaattorilla ja tee tarvittaessa myös oma vapautusfunktio tuolle datalle, jos ohjelma sellaista tukee.

Tumettaja [06.02.2009 17:16:04]

#

Kiitoksia avusta, yritän soveltaa antamaasi koodia parhaani mukaan.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta