c - 如何从 fopen 文件结构中获取文件句柄?

标签 c winapi windows-ce msvcrt crt

<a href="http://msdn.microsoft.com/en-us/library/yeby3zcb.aspx" rel="noreferrer noopener nofollow">fopen</a>函数返回指向 FILE 的指针结构,在不处理其内容或含义的情况下,应将其视为不透明值。

在 Windows 上,C 运行时是 Windows API 的包装器,fopen函数依赖于 <a href="http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx" rel="noreferrer noopener nofollow">CreateFile</a>功能。 CreateFile函数返回 HANDLE ,它被其他 Windows API 使用。

现在,我需要在使用 fopen 的库中深入使用 Windows API和 FILE* .所以:有没有办法得到 HANDLE来自 FILE结构体?因为这是特定于编译器的,所以我指的是 MSVC 运行时库。

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

最佳答案

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

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

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

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

关于c - 如何从 fopen 文件结构中获取文件句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3989545/

相关文章:

.net - 如何检查 NTAccount 对象是代表组还是用户?

c++ - 休眠失败时的 Windows 通知

.net - 在 2008 年后的 Visual Studio 中开发 .NET Compact Framework 应用程序?

testing - 网络带宽评估工具

c - 如何在以下简单的设备读取程序中使用 'cat'

c - 一个数的质因数

c - C什么时候不需要address-of运算符?

c - C 中的 Delete() 函数中的段错误(核心转储)

c++ - 绑定(bind)方法给出错误 10038 (WSAENOTSOCK)

c++ - DeactivateDevice 与 IOCTL_BUS_DEACTIVATE_CHILD