将HANDLE转换为Handle

时间:2014-07-02 19:12:27

标签: winapi haskell io

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

win32handleToStandardHandle :: HANDLE -> IO Handle

我该如何实现?

在linux上,我可以使用System.Posix.IO的{​​{1}}函数在linux系统调用使用的fdToHandle类型和标准的haskell类型之间进行转换。但似乎没有Windows的这种功能。

1 个答案:

答案 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

我还没有尝试过这个。