我想通过FFI使用WinAPI的CreatePipe
在Windows上创建一个匿名管道。这将给我一个HANDLE
(来自Win32
haskell包的类型),但我想获得一个普通的haskell Handle
,这样我就可以使用标准的haskell IO函数了。所以我需要一个类型的函数:
win32handleToStandardHandle :: HANDLE -> IO Handle
我该如何实现?
在linux上,我可以使用System.Posix.IO
的{{1}}函数在linux系统调用使用的fdToHandle
类型和标准的haskell类型之间进行转换。但似乎没有Windows的这种功能。
答案 0 :(得分:11)
即使在Windows上,System.IO
中文件的标准实现也使用文件描述符,而不是win32 HANDLE
。这些文件描述符由C运行时提供,而不是Windows。要将HANDLE
转换为文件描述符,运行时会提供_open_osfhandle
函数。 GHC在Windows上使用MinGW,但MinGW不提供自己的C运行时,因此Haskell EXE使用msvcrt.dll。
使用FFI导入_open_osfhandle
。使用此选项可将HANDLE
转换为文件描述符,然后调用fdToHandle
,它似乎位于GHC.IO.Handle.FD
。
我还没有尝试过这个。