2013-02-07 28 views
7

Tôi có một ứng dụng có vùng bộ nhớ dùng chung được xác định với CreateFileMapping và tôi đang cố đọc bộ nhớ đó từ một ứng dụng khác.Tại sao CreateFileMapping trả về "tệp đã tồn tại"?

Tôi cố gắng này:

handle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 
      0,$3200, pchar('FileMappingZone')); 

Nhưng tôi nhận được:

Không thể tạo một tập tin khi tập tin đó đã tồn tại

gì có thể là vấn đề?

+2

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). –

+0

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

+0

@ 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'. –

Trả lời

15

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ệ để 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.

+0

Trong trường hợp này, ứng dụng chia sẻ sẽ gọi 'CreateFileMapping()' để chia sẻ dữ liệu và ứng dụng đọc nên sử dụng 'OpenFileMapping()' thay vì 'CreateFileMapping()' để đọc dữ liệu được chia sẻ. Nếu 'OpenFileMapping()' không thành công thì ứng dụng chia sẻ không chia sẻ bất kỳ dữ liệu nào (trừ khi xảy ra lỗi khác, như ứng dụng đọc không có quyền truy cập ánh xạ của ứng dụng chia sẻ). Tôi sẽ không có một ứng dụng đọc tạo bản đồ nếu nó chưa tồn tại, trừ khi nó có ý định chia sẻ dữ liệu của riêng nó. –

+0

Tôi sẽ có một ứng dụng đọc tạo bản đồ nếu tôi muốn chúng có thể bắt đầu theo thứ tự bất kỳ (và không đợi/thử lại với các chủng tộc có thể), điều này đôi khi rất quan trọng. Ví dụ của OP cung cấp một kích thước cho việc lập bản đồ tệp, vì vậy rõ ràng là anh ta biết rằng ứng dụng khác đủ quan trọng để đưa ra quyết định. –

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