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

lor*_*ova 27 c winapi crt msvcrt windows-ce

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

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

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

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

Ste*_*end 16

使用_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
Run Code Online (Sandbox Code Playgroud)

事实证明_fileno返回一个句柄.你只需要施展它."

  • 谢谢,_fileno 对我的 Windows CE 问题来说已经足够好了,但是您的答案在具有任何版本的 MSVC 的所有 MS 平台上似乎实际上是“可移植的”。 (2认同)

Did*_*set 5

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

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

  • 嗯,这是可能的:http://msdn.microsoft.com/en-us/library/ee479262.aspx 指出“_fileno 获取与流关联的文件句柄”。至少在 Windows CE 上它应该可以工作。 (2认同)

小智 5

对于C,试试这个

HANDLE foo = (HANDLE)_get_osfhandle(fileno(fopen("bar.txt", "w")));
Run Code Online (Sandbox Code Playgroud)