Winapi 将句柄转换为句柄

Winapi 将句柄转换为句柄,winapi,haskell,io,Winapi,Haskell,Io,我想在windows上通过FFI使用WinAPI创建一个注释性管道。这将给我一个句柄(从haskell包中键入),但我希望得到一个普通的haskell句柄,这样我就可以在它上面使用标准的haskell IO函数。所以我需要一个类型为的函数: win32handleToStandardHandle :: HANDLE -> IO Handle 我如何实现这一点 在linux上,我可以使用System.Posix.IO的fdToHandle函数在linux系统调用使用的FD类型和标准hask

我想在windows上通过FFI使用WinAPI创建一个注释性管道。这将给我一个
句柄
(从haskell包中键入),但我希望得到一个普通的haskell
句柄
,这样我就可以在它上面使用标准的haskell IO函数。所以我需要一个类型为的函数:

win32handleToStandardHandle :: HANDLE -> IO Handle
我如何实现这一点


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

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

使用FFI导入
\u open\u osf手柄
。使用此选项将
句柄
转换为文件描述符,然后调用
fdToHandle
,它似乎位于
GHC.IO.HANDLE.FD


实际上我还没有试过这个。

看起来
HANDLE
只是一个类型同义词:
type HANDLE=Ptr()
。我不知道如何回答你的问题,但这并没有给转换函数太多的工作\我可以看到,
HANDLE
被定义为
typehandle=Ptr()
,而
HANDLE
是一种代数数据类型,表示RW的单个句柄或双工句柄,其本身由复杂的记录结构实现。是否有许多函数用于从Win32 API获取有关
句柄的信息?您将需要诸如缓冲模式、当前字符缓冲区、文本编码等内容。您可以自己编写它,但我想这可能会有点乏味,要获得正确的结果。MinGW不提供自己的C运行时,是吗?大多数人似乎都链接到(不受支持的!)msvcrt.dll,因此MS文档将尽可能地靠近您。@HarryJohnston您说得对。Haskell EXEs从msvcrt.dll导入C的标准函数。没错,
fdToHandle
存在于
GHC.IO.Handle.FD
中。但是,它采用类型为
FD
的参数,该参数在非公开模块
GHC.IO.FD
中定义。但是正如您所说,
HANDLE
并没有得到GHC IO函数的真正支持,因此我将直接为
HANDLE
编写读/写函数,这要容易得多。@bennofs有两种不同的类型,称为
FD
。非公开的有点复杂,但是
fdToHandle
使用的是
System.Posix.Internals.FD
,它只是一个
CInt
@bennofs:注意每个
句柄都有一个相关的
句柄,因为没有一个句柄,进程实际上无法执行任何I/O。这里唯一的区别是,您希望使用自己打开的
句柄,而不是Haskell(和C运行时)为您打开的句柄。