2013-06-16 14 views
7

Quindi, in pratica, desidero scrivere un array di byte su un file, tuttavia il programma si blocca. Eccezione non gestita a 0x7766DEE1 (KernelBase.dll) in append.exe: 0xC0000005: posizione di scrittura della violazione di accesso 0x00000000.Writefile provoca un arresto anomalo, con violazione di accesso

BYTE *image ; 
BYTE *bigMem; 
#define REASONABLY_LARGE_BUFFER 16777216 
file = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

fileSize = GetFileSize(file, NULL); 

bigMem = (BYTE *)HeapCreate(NULL, REASONABLY_LARGE_BUFFER, 0); 
image = (BYTE *)HeapAlloc(bigMem, HEAP_ZERO_MEMORY, fileSize); 
if (bigMem == NULL || image == NULL){ 
    printf("Allocation failed"); 
    return EXIT_FAILURE; 
} 
printf("We are writing to the file %p, with data location %p, and filesize %d\n", file, image, fileSize); 
LPDWORD at = 0; 
WriteFile(file, image, fileSize, at, NULL); 

Quella di stampa dice: Stiamo scrivendo al file 00.000.038, con dati di posizione 02.451.590, e la dimensione del file 161169

+0

Sei sicuro che 16 MB sia "abbastanza grande"? Cosa succede se il sistema operativo non vuole darti quella quantità di memoria heap e la funzione di allocazione restituisce 'NULL'? Tu ** mai ** controlla che, dovresti. –

+0

Ho appena inserito il codice per controllare se bigMem o l'immagine sono nulli e nessuno dei due lo è. – ThePlague

+0

Se si aggiunge il controllo degli errori, è necessario verificare che il file sia stato effettivamente aperto. –

risposta

13

L'argomento passato alla WriteFile usato per memorizzare il numero di byte scritti (at) può solo essere nullo se l'argomento per la struttura sovrapposta è non null. Suggerisco di cambiare at in modo da essere un DWORD e passare un puntatore ad esso.

DWORD at; 
WriteFile(file, image, fileSize, &at, NULL); 
+0

Non posso credere di averlo perso. Soprattutto dopo aver guardato tutti quelli in cui commentano che non può essere nullo. – ThePlague

+0

Succede, specialmente dopo aver guardato lo stesso codice per un po ';) –

+0

Grazie per la risposta, ma per l'amore per tutto ciò che è santo, a cosa stavano pensando quando hanno inventato questa limitazione? – mercurytw

Problemi correlati