ReadFile Problem
-
Wo ist der allokierte Speicher für lpBuffer?
Er könnte wie folgt allokiert werden:
lpBuffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,ret_size);
-
Gleicher Fehler

Wieso geht das denn nicht für lpBuffer wurde doch jetzt der Speicher allokiert.
#include <iostream> #include <windows> #include <fstream> #include <stdio.h> using namespace std; int main(int argc, char* argv[]) { HANDLE create_file_hwnd; bool read_file; string name; int length =0; LPVOID lpBuffer; LPDWORD size; DWORD ret_size; HANDLE hfile; ret_size = GetFileSize ( hfile , size ); lpBuffer = HeapAlloc( GetProcessHeap () , HEAP_ZERO_MEMORY , ret_size); cout<<"Size: " << size << endl; create_file_hwnd = CreateFile ( "test.txt", GENERIC_READ , FILE_SHARE_READ , 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); cout<<"Create File Handle: " << create_file_hwnd << endl; read_file = ReadFile ( create_file_hwnd, lpBuffer, sizeof(lpBuffer) , NULL, NULL ); cout<< GetLastError(); // gibt als fehlercode 998 aus cout<<"bool ReadFile: " << read_file << endl; cout<<lpBuffer; system("PAUSE"); return 0; } //---------------------------------------------------------------------------
-
sizeof(lpBuffer) liefert die Größe von LPVOID.
Einfach ret_size benutzen...
-
Es tritt noch immer der selbe Fehler auf -.-
Wie kann ich den rausfinden wofür z.b. der Error Code 998 steht?
#include <iostream> #include <windows> #include <fstream> #include <stdio.h> using namespace std; int main(int argc, char* argv[]) { HANDLE create_file_hwnd; bool read_file; string name; int length =0; LPVOID lpBuffer; LPDWORD size; DWORD ret_size; HANDLE hfile; ret_size = GetFileSize ( hfile , size ); lpBuffer = HeapAlloc( GetProcessHeap () , HEAP_ZERO_MEMORY , ret_size); cout<<"Size: " << size << endl; create_file_hwnd = CreateFile ( "test.txt", GENERIC_READ , FILE_SHARE_READ , 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); cout<<"Create File Handle: " << create_file_hwnd << endl; read_file = ReadFile ( create_file_hwnd, lpBuffer, ret_size , NULL, NULL ); cout<< GetLastError(); // gibt als fehlercode 998 aus cout<<"bool ReadFile: " << read_file << endl; cout<<lpBuffer; system("PAUSE"); return 0; }
-
Benutz einfach Google und MSDN:
http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx
-
Ok jetzt geht es:
#include <iostream> #include <windows> #include <fstream> #include <stdio.h> using namespace std; int main(int argc, char* argv[]) { HANDLE hfile=(HANDLE)-1; DWORD nbt=0; TCHAR buf[10]; DWORD ret_size; LPDWORD size; hfile = CreateFile ( "test.txt", GENERIC_READ , FILE_SHARE_READ , 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); ret_size = GetFileSize ( hfile , size ); ZeroMemory(buf,10); ReadFile (hfile ,(LPVOID)buf , ret_size , &nbt , NULL ); cout<<buf; system("PAUSE"); return 0; }
-
Kurze Frage noch:
Ist das Programm so sicher vor Buffer Ovferflows ?
#include <iostream> #include <windows> #include <fstream> #include <stdio.h> using namespace std; int main(int argc, char* argv[]) { HANDLE hfile=(HANDLE)-1; DWORD nbt=0; char *buf; DWORD ret_size; LPDWORD size; hfile = CreateFile ( "test.txt", GENERIC_READ , FILE_SHARE_READ , 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); ret_size = GetFileSize ( hfile , size ); buf = new char [ ret_size ]; ZeroMemory(buf,10); ReadFile (hfile ,(LPVOID)buf , ret_size , &nbt , NULL ); cout<<buf; system("PAUSE"); return 0; }
-
Ja...denn Du allokierst genau so viel Speicher, wie Du brauchst. mit delete[] gibst Du ihn wieder frei.
Du hättest bei HeapAlloc() bleiben können, das war nicht der Fehler. Du hattest keine DWORD-Variable übergeben, die die Größe des tatsächlich gelesenen BYTES aufnimmt (bei ReadFile()); auch solltest Du überprüfen, ob der Speicher wirklich allokiert wurde.
Bei der Funktion HeapAlloc() kannst Du den Parameter HEAP_GENERATE_EXCEPTIONS angeben, dabei wird dann automatisch eine Exception ausgegeben, wenn der Speicher nicht allokiert werden kann. Bei der Funktion ZeroMemory() statt zehn ret_size übergeben
-
Wenn ich bei ZeroMemory(buf,ret_size); eingebe dann sieht die Ausgabe so bei mir aus:
1234∟vg2Drücken Sie eine beliebige Taste . . .
Obwohl in der Datei nur der Text 1234 steht.
-
ReadFile schrieb:
Obwohl in der Datei nur der Text 1234 steht.
Das liegt daran, dass cout davon ausgeht, dass da ein nullterminierter Text folgt. Deine Daten sind nicht nullterminiert.
-
@ReadFile
1.) Dein Code hat einen bitterbösen Bug wenn CreateFile schiefgeht und ein ungültiges Handle zurückgibt. Denn dann liefert die Funktion GetFileSize vermutlich INVALID_FILE_SIZE zurück was auf meinem Rechner als ((DWORD)0xFFFFFFFF) definiert ist. Und boom knallt die Zeile new weil er versucht 0xFFFFFFFF Bytes zu reservieren. Du kannst ja mal ausprobieren was passiert wenn du die Datei test.txt löschst/verschiebst so dass CreateFile diese nicht mehr findet.
2.) Der zweite Parameter der Funktion GetFileSize ist falsch.
Richtig wäre folgendes:... DWORD size; ... ret_size = GetFileSize (hfile , &size); // oder // ret_size = GetFileSize (hfile , NULL);LPDWORD ist nichts als ein Pointer (auf eine DWORD Variable). Die Funktion will aber einen DWORD zurückgeben wenn der size Parameter ungleich NULL ist. Also gibt man der Funktion GetFileSize die Adresse des DWORD's an.
Kleiner Tipp am Rande: Nimm mal dein erstes Codebeispiel und debugge das Ganze durch. Schaue vor allen Dingen was du in die Funktionen steckst und was du wieder herausbekommst. Du hast da nämlich ein paar ganze böse Sachen gemacht
