2010-10-21 14 views
24

Hàm fopen trả về một con trỏ tới cấu trúc FILE, được coi là một giá trị mờ đục, không xử lý nội dung hoặc ý nghĩa của nó.Làm cách nào để lấy tệp HANDLE từ cấu trúc FILE fopen?

Trên Windows, thời gian chạy C là trình bao bọc của API Windows và chức năng fopen dựa trên chức năng CreateFile. Hàm CreateFile trả về một HANDLE, được sử dụng bởi các API Windows khác.

Bây giờ, tôi cần phải sử dụng API Windows sâu bên trong thư viện sử dụng fopenFILE*. Vì vậy: có cách nào để lấy số HANDLE từ cấu trúc FILE không? Vì đây là trình biên dịch cụ thể, tôi có nghĩa là trên thư viện thời gian chạy MSVC.

Tôi hiểu rằng đây sẽ là một bản hack xấu xí, không di động và có thể bị hỏng nếu Microsoft thay đổi định dạng nội bộ là FILE ... nhưng tôi đang phát triển trên hệ thống đóng (ví dụ: trên hệ thống nhúng Windows CE) và tái cấu trúc thư viện sẽ khó và tốn thời gian.

+1

Great câu hỏi này, tôi xử lý cái này bản thân mình hơn 2 năm về trước. –

Trả lời

15

Sử dụng _fileno theo sau là _get_osfhandle. Đừng quên _close khi bạn hoàn tất.

CHỈNH SỬA: không rõ ràng với tôi rằng _get_osfhandle được hỗ trợ trên WinCE. Tuy nhiên, các tài liệu cho WinCE _fileno nói rằng nó trả về một "xử lý tệp" thay vì "bộ mô tả". YMMV nhưng điều này gợi ý rằng bạn có thể chỉ cần sử dụng giá trị trả về _fileno trực tiếp dưới dạng xử lý trên WinCE.

EDIT: # 2 Lý thuyết đó được hỗ trợ bởi this person's experience.

"Nếu bạn xem các tệp tiêu đề mà tôi đã đăng lên danh sách vào ngày 29 tháng 1 bạn có thể xem cách tôi xử lý sự cố tạo/xử lý tệp. Tôi không có để thay thế tất cả các mục * FILE . xử lý Xem đoạn sau đây từ fileio.cpp:

#ifndef q4_WCE 

    FlushFileBuffers((HANDLE) _get_osfhandle(_fileno(_file))); 
    HANDLE h = ::CreateFileMapping((HANDLE) 
_get_osfhandle(_fileno(_file)), 
         0, PAGE_READONLY, 0, len, 0); 
#else 

    FlushFileBuffers((HANDLE) _fileno(_file)); 
    HANDLE h = ::CreateFileMapping((HANDLE) _fileno(_file), 
        0, PAGE_READONLY, 0, len, 0); 
#endif //q4_WCE 

nó chỉ ra rằng _fileno trả về một tay cầm Bạn chỉ phải bỏ nó "..

+1

Cảm ơn bạn, _fileno là đủ tốt cho vấn đề Windows CE của tôi, nhưng câu trả lời của bạn có vẻ thực sự "di động" trên tất cả các nền tảng MS với bất kỳ phiên bản nào của MSVC. – Wizard79

4

Trên Linux, có chức năng int fileno(FILE *); trả về bộ mô tả tệp (bộ mô tả được trả về bởi hàm open cấp thấp) từ FILE*.

Tôi không biết liệu nó có áp dụng cho Windows và trả về HANDLE không?

+1

Hmm, có thể: http://msdn.microsoft.com/en-us/library/ee479262.aspx tuyên bố rằng "_fileno được xử lý tệp được liên kết với luồng". Ít nhất là trên Windows CE, nó sẽ hoạt động. – Wizard79

+1

Nó chỉ là một chức năng tương thích cho * nix. Xử lý là con trỏ có kích thước, 8 byte trên Win64. –

2

Đối với C, hãy thử

HANDLE foo = (HANDLE)_get_osfhandle(fileno(fopen("bar.txt", "w"))); 
+0

Được sử dụng sau, điều này cho tôi biết xử lý không hợp lệ cho ví dụ: stdout. – imallett

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