2010-10-21 15 views
24

fopen函數返回指向FILE結構的指針,該結構應被視爲不透明的值,而不處理其內容或含義。如何從fopen FILE結構中獲取文件HANDLE?

在Windows上,C運行時是Windows API的包裝,而fopen函數依賴於CreateFile函數。 CreateFile函數返回其他Windows API使用的HANDLE

現在,我需要在使用fopenFILE*的庫的內部深處使用Windows API。所以:有沒有辦法從FILE結構中獲得HANDLE?由於這是編譯器特定的,我的意思是在MSVC運行時庫上。

我明白,這將是一個醜陋的,非便攜式的黑客,以及如果微軟改變了FILE的內部格式可能爆發......但我是Windows CE嵌入式系統的封閉系統開發(即)和重構圖書館將是困難和耗時的。

+1

大問題,我處理這一個自己2年多前。 – 2010-10-21 20:25:28

回答

15

使用_fileno後面跟着_get_osfhandle。當你完成後,不要忘記_close

編輯:我不清楚在WinCE上支持_get_osfhandle。但是WinCE _fileno的文檔說它返回一個「文件句柄」而不是「描述符」。 YMMV,但這表明,您可以直接使用_fileno返回值作爲WinCE的句柄。

編輯:#2該理論支持this person's experience

「如果您看看我在1月29日發佈到列表中的頭文件,您可以看到我是如何處理文件創建/處理問題的,我沒有 將所有FILE *項目替換爲。處理來自 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 

事實證明,_fileno返回的句柄你一定要投它。」

+1

謝謝_fileno對於我的Windows CE問題已經足夠了,但是您的答案似乎實際上在任何版本的MSVC的MS平臺上都是「可移植的」。 – Wizard79 2010-10-21 17:54:09

4

在Linux上,有int fileno(FILE *);函數從FILE*返回文件描述符(由低級open函數返回的函數)。

我不知道它是否適用於Windows並返回HANDLE?

+1

嗯,這是可能的:http://msdn.microsoft.com/en-us/library/ee479262.aspx指出「_fileno獲取與流相關的文件句柄」。至少在Windows CE上它應該可以工作。 – Wizard79 2010-10-21 16:28:18

+1

它只是* nix的compat函數。處理程序是指針大小,Win64上8個字節。 – 2010-10-21 16:53:33

2

對於C,試試這個

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

稍後使用,這是告訴我句柄對於例如標準輸出。 – imallett 2016-12-17 19:39:59

相關問題