【问题标题】:How do I retrieve the FILE* of a CreateFile result?如何检索 CreateFile 结果的 FILE*?
【发布时间】:2011-09-09 08:48:52
【问题描述】:

见标题。

如何实现这个问题的反面:How do I get the file HANDLE from the fopen FILE structure?

我用

创建句柄
      HANDLE h = CreateFile(name,
                            GENERIC_WRITE,
                            0,
                            NULL,
                            OPEN_ALWAYS,
                            FILE_ATTRIBUTE_NORMAL,
                            NULL);

然后尝试使用fputs 向其写入一些数据。

fputs的调用失败

_VALIDATE_STREAM_ANSI_RETURN(stream, EINVAL, EOF);

其中stream 是我从CreateFile 获得的句柄。


我这样做的原因是我使用了一个使用FILE* 句柄的外部库,并且我没有打开一个普通文件(直到现在),而是尝试写入管道。并且更改外部库不是一种选择。

【问题讨论】:

    标签: c visual-studio winapi


    【解决方案1】:

    不知道这是否是最好的方法,但请参阅_open_osfhandle()

    http://msdn.microsoft.com/en-us/library/bdts1c9x(v=vs.71).aspx

    int fd = _open_osfhandle(h, ...);
    

    它返回一个文件描述符,您必须使用fdopen 打开它才能获得FILE*

    FILE* fp = _fdopen(fd, ...);
    

    【讨论】:

      【解决方案2】:

      CreateFile 返回文件的内部 Windows 句柄。您可以使用 WriteFile 之类的函数使用此句柄写入文件。

      要使用fputs,您需要在C 中使用fopen 函数打开文件。如果这样做,则不需要显式调用CreateFile,因为fopen 会为您执行此操作,如果使用参数“w”(用于“写”)调用。

      因此,我认为您所追求的东西是不可能的。两组功能不兼容。

      【讨论】:

      • (和支持者):请参阅 Emil 的回答。这个对我有用。这种方法有什么问题吗(如果有,请评论他的回答)?
      • 感谢您的指点(不是双关语)。这是一个很棒的发现。
      猜你喜欢
      • 2019-06-14
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2012-06-25
      相关资源
      最近更新 更多