代码之家  ›  专栏  ›  技术社区  ›  Serge Rogatch

使用createfile打开文件*

  •  2
  • Serge Rogatch  · 技术社区  · 6 年前

    有创建stdio的方法吗 FILE* 基于winapi返回的句柄的结构 CreateFile 在C++中?

    1 回复  |  直到 6 年前
        1
  •  6
  •   user7860670    6 年前

    可能是这样:

    #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;
    }