35

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

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

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

我知道这将是一个丑陋的、不可移植的 hack,如果 Microsoft 更改FILE...的内部格式,它可能会崩溃,但我正在一个封闭的系统上开发(即在 Windows CE 嵌入式系统上)并重构库将是困难和耗时的。

4

3 回答 3

20

使用_fileno后跟_get_osfhandle. 完成后不要忘记_close它。

编辑:我不清楚_get_osfhandleWinCE 是否支持。但是 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

事实证明 _fileno 返回一个句柄。你只需要投射它。”

于 2010-10-21T16:44:48.463 回答
7

在 Linux 上,有int fileno(FILE *);一个open函数从FILE*.

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

于 2010-10-21T16:18:53.580 回答
4

对于 C,试试这个

HANDLE foo = (HANDLE)_get_osfhandle(fileno(fopen("bar.txt", "w")));
于 2012-07-30T05:13:14.380 回答