如何从fopen FILE结构中获取文件HANDLE?

时间:2010-10-21 16:11:31

标签: c winapi windows-ce msvcrt crt

fopen函数返回指向FILE结构的指针,该结构应被视为不透明值,而不处理其内容或含义。

在Windows上,C运行时是Windows API的包装,fopen函数依赖于CreateFile函数。 CreateFile函数返回HANDLE,由其他Windows API使用。

现在,我需要在使用fopenFILE*的库内部使用Windows API。那么:有没有办法从HANDLE结构中获取FILE?由于这是特定于编译器的,我的意思是在MSVC运行时库上。

据我所知,这将是一个丑陋的,不可移植的黑客,如果微软改变FILE的内部格式,可能会破坏...但我正在开发一个封闭的系统(即在Windows上) CE嵌入式系统)和重构库将是困难和耗时的。

3 个答案:

答案 0 :(得分:15)

使用_fileno后跟_get_osfhandle。完成后别忘了_close

编辑:我不清楚WinCE是否支持_get_osfhandle。然而,WinCE _fileno的文档说它返回“文件句柄”而不是“描述符”。 YMMV,但这表明你可以直接使用_fileno返回值作为WinCE的句柄。

编辑:#2该理论得到this person's experience的支持。

“如果您查看我在1月29日发布到列表中的头文件 你可以看到我如何处理文件创建/处理问题。我没有 用HANDLEs替换所有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 :(得分:5)

在Linux上,有int fileno(FILE *);函数从open返回文件描述符(低级FILE*函数返回的文件描述符)。

我不知道它是否适用于Windows并返回HANDLE?

答案 2 :(得分:3)

对于C,试试这个

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