【问题标题】:How do I get the file HANDLE from the fopen FILE structure?如何从 fopen FILE 结构中获取文件 HANDLE?
【发布时间】:2011-04-28 17:18:07
【问题描述】:

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

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

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

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

【问题讨论】:

  • 好问题,2 年前我自己处理过这个问题。

标签: c winapi windows-ce msvcrt crt


【解决方案1】:

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

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

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

“如果你看看我在 1 月 29 日发布到列表中的头文件 你可以看到我是如何处理文件创建/处理问题的。我没有 用 HANDLE 替换所有 FILE* 项目。请参阅以下 sn-p 来自 文件io.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 返回一个句柄。你只需要投射它。”

【讨论】:

  • 谢谢,_fileno 对我的 Windows CE 问题来说已经足够好了,但你的答案似乎在所有 MS 平台上任何版本的 MSVC 上都是“可移植的”。
【解决方案2】:

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

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

【讨论】:

  • 嗯,这是可能的:msdn.microsoft.com/en-us/library/ee479262.aspx 声明“_fileno 获取与流关联的文件句柄”。至少在 Windows CE 上它应该可以工作。
  • 它只是*nix 的一个兼容函数。句柄是指针大小的,在 Win64 上为 8 个字节。
【解决方案3】:

对于 C,试试这个

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

【讨论】:

  • 稍后使用,这告诉我句柄无效,例如标准输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2021-08-08
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2010-12-03
相关资源
最近更新 更多