2013-06-16 55 views
7

Vì vậy, về cơ bản tôi muốn viết một mảng byte vào một tệp, tuy nhiên chương trình bị treo. Ngoại lệ chưa xử lý tại 0x7766DEE1 (KernelBase.dll) trong append.exe: 0xC0000005: Vi phạm quyền truy cập ghi vị trí 0x00000000.Writefile gây ra sự cố, với vi phạm truy cập

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); 

Đó in nói: Chúng tôi viết vào file 00.000.038, với vị trí dữ liệu 02.451.590, và filesize 161169

+0

Bạn có chắc chắn 16MB là "hợp lý lớn" không? Điều gì xảy ra nếu hệ điều hành không muốn cung cấp cho bạn nhiều bộ nhớ heap và hàm phân bổ trả về 'NULL'? Bạn ** không bao giờ ** kiểm tra điều đó, bạn nên. –

+0

Tôi chỉ cần đặt mã vào để kiểm tra xem bigMem hoặc hình ảnh có null hay không. – ThePlague

+0

Nếu bạn đang thêm kiểm tra lỗi, bạn nên kiểm tra xem tệp có thực sự được mở hay không. –

Trả lời

13

Đối số truyền cho WriteFile sử dụng để lưu trữ các số byte bằng văn bản (at) có thể chỉ là null nếu đối số cho cấu trúc chồng chéo là không phải là null. Tôi đề nghị thay đổi at thành DWORD và chuyển con trỏ đến nó.

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

Tôi không thể tin rằng mình đã bỏ lỡ điều đó. Đặc biệt là sau khi nhìn vào tất cả những người mà họ bình luận rằng nó không thể là rỗng. – ThePlague

+0

Điều đó xảy ra, đặc biệt là sau khi bạn nhìn vào cùng một mã;) –

+0

Cảm ơn bạn đã trả lời, nhưng vì tình yêu của tất cả những điều đó là thánh thiện, họ nghĩ gì khi họ nghĩ ra ràng buộc đó? – mercurytw

Các vấn đề liên quan