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; }
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.
Kiitoksia avusta, yritän soveltaa antamaasi koodia parhaani mukaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.