如何从fopen FILE结构中获取文件HANDLE?
fopen
函数返回一个指向FILE
结构的指针,该结构应被视为不透明值,而不处理其内容或含义。
在Windows上,C运行时是Windows API的包装, fopen
函数依赖于CreateFile
函数。 CreateFile
函数返回一个HANDLE
,由其他Windows API使用。
现在,我需要在使用fopen
和FILE*
的库内部使用Windows API。 那么:有没有办法从FILE
结构中获取HANDLE
? 由于这是特定于编译器的,我的意思是在MSVC运行时库上。
我知道这将是一个丑陋的,不可移植的黑客,如果微软改变FILE
的内部格式,可能会破坏…但我正在开发一个封闭的系统(即在Windows CE嵌入式系统上)并重构图书馆既困难又耗时。
使用_fileno
后跟_fileno
。 完成后别忘了_close
它。
编辑:我不清楚WinCE是否支持_get_osfhandle。 但是,WinCE _fileno
的文档说它返回“文件句柄”而不是“描述符”。 YMMV,但这表明您可以直接使用_fileno
返回值作为WinCE上的句柄。
编辑:#2这个理论得到了这个人的经验的支持。
“如果您看一下我在1月29日发布到列表中的头文件,您可以看到我如何处理文件创建/处理问题。我没有用HANDLE替换所有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
事实certificate_fileno返回一个句柄。 你只需要施展它。“
在Linux上,有int fileno(FILE *);
从FILE*
返回文件描述符(由低级别open
函数返回的文件描述符)的函数。
我不知道它是否适用于Windows并返回HANDLE但是?
对于C,试试这个
HANDLE foo = (HANDLE)_get_osfhandle(fileno(fopen("bar.txt", "w")));