<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/