将HANDLE转换为Handle

ben*_*ofs 9 io winapi haskell

我想CreatePipe通过FFI 使用WinAPI 在Windows上创建一个匿名管道.这将给我一个HANDLE(来自Win32haskell包的类型),但我想获得一个普通的haskell,Handle这样我就可以使用标准的haskell IO函数了.所以我需要一个类型的函数:

win32handleToStandardHandle :: HANDLE -> IO Handle
Run Code Online (Sandbox Code Playgroud)

我该如何实现呢?

在Linux上,我可以使用System.Posix.IOfdToHandle功能的之间的转换FD由Linux系统调用和标准Haskell的类型使用类型.但似乎没有Windows的这种功能.

arx*_*arx 11

即使在Windows上,文件的标准实现也System.IO使用文件描述符,而不是win32 HANDLE.这些文件描述符由C运行时提供,而不是Windows.要将a转换为HANDLE文件描述符,运行时会提供该_open_osfhandle函数.GHC在Windows上使用MinGW,但MinGW不提供自己的C运行时,因此Haskell EXE使用msvcrt.dll.

使用FFI导入_open_osfhandle.使用它将您转换HANDLE为文件描述符,然后调用fdToHandle,它似乎存在GHC.IO.Handle.FD.

我还没试过这个.