Search code examples
c++filewinapifopencreatefile

Open FILE* using CreateFile


Is there a way to create stdio's FILE* structure on the basis of a handle returned by WinAPI's CreateFile in C++?


Solution

  • Maybe like this:

    #include <Windows.h>
    #include <io.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <stddef.h>
    
    // takes ownership of h_file
    // caller is responsible for disposing of returned stream descriptor
    [[nodiscard]] FILE *
    make_stream(HANDLE const h_file)
    {
         FILE * p_file{};
         int const fd{::_open_osfhandle(reinterpret_cast<::intptr_t>(h_file), _O_RDONLY)}; // transferring h_file ownerhip
         if(-1 != fd)
         {
              p_file = ::_fdopen(fd, "r"); // transferring fd ownerhip
              if(NULL != p_file)
              {
                  // ok
              }
              else
              {
                   if(-1 == ::_close(fd))
                   {
                       ::abort();
                   }
              }
         }
         else
         {
             if(FALSE == ::CloseHandle(h_file))
             {
                 ::abort();
             }
         }
         return p_file;
    }