Không phải mọi thứ đặt giá trị GetLastError()
thành không thành công đều là lỗi. Điều quan trọng là phải phân biệt các lỗi theo giá trị trả về của hàm trước và kiểm tra GetLastError()
để biết thêm thông tin về loại lỗi đã xảy ra.
Đối với các ánh xạ đã tồn tại, CreateFileMapping
được ghi chép lại để trả về một xử lý hợp lệ và để thiết lập giá trị cho GetLastError()
ERROR_ALREADY_EXISTS
. Trong trường hợp này, giá trị lỗi là thông tin: nó hợp lệ để kiểm tra xem liệu bạn có quan tâm đến việc ánh xạ đã có trước khi bạn mở nó hay không, nhưng nó không phải là lỗi. Bạn phát hiện lỗi bằng cách kiểm tra giá trị trả về là NULL. Nếu không, bạn chỉ cần đi trước và sử dụng tay cầm.
P.S. Nếu bạn muốn đảm bảo rằng phần tồn tại trước khi mở, bạn có thể sử dụng OpenFileMapping
sẽ thất bại cho các phần không tồn tại thay vì tạo một phần mới.
Nguồn
2013-02-07 12:15:50
Trình bao bọc của bạn xung quanh cuộc gọi winapi có kiểm tra 'GetLastError' vô điều kiện sau mỗi cuộc gọi không? Dự kiến 'CreateFileMapping' sẽ trả về một xử lý hợp lệ ** và ** cho' GetLastError' sau đây để trả về 'ERROR_ALREADY_EXISTS' (đây không phải là lỗi nếu đó là những gì bạn mong đợi). –
Tôi gọi GetLastError ngay sau khi cuộc gọi trên CreateFileMapping, nếu tôi đóng ứng dụng đã tạo ánh xạ tệp trước khi nó nói: Hoạt động hoàn thành succesefully – opc0de
@ opc0de Đừng làm điều đó. Chỉ gọi 'GetLastError' khi tài liệu hướng dẫn làm như vậy. Và đó là khi 'CreateFileMapping' trả về' NULL'. –