2014-07-02 17 views
9

Chcę utworzyć annonymous potoku na windows przy użyciu CreatePipe z WinAPI za pośrednictwem FFI. To da mi HANDLE (rodzaj z pakietu haskell Win32), ale chciałbym uzyskać zwykły haskell Handle taki, że mogę używać standardowych funkcji IO na nim. Potrzebuję funkcji typu:Konwertuj UCHWYT do obsługi

win32handleToStandardHandle :: HANDLE -> IO Handle 

Jak mogę to wdrożyć?

W systemie Linux mogę używać funkcji System.Posix.IO ' do konwersji między typem FD używanym przez wywołania systemowe systemu Linux i standardowym typem komendy. Ale wydaje się, że nie ma takiej funkcji dla okien.

+0

Wygląda na to, że 'HANDLE' jest po prostu synonimem typu:' type HANDLE = Ptr() '. Nie mam pojęcia, jak odpowiedzieć na twoje pytanie, ale to nie daje dużo funkcji konwersji do pracy z ...: \ –

+0

Widzę, że 'UCHWYT" jest zdefiniowany jako 'typ HANDLE = Ptr()', natomiast 'Uchwyt 'jest algebraicznym typem danych reprezentującym jeden uchwyt lub uchwyt dupleksu dla RW, który sam jest implementowany przez złożoną strukturę rekordów. Czy istnieje wiele funkcji uzyskiwania informacji o 'UCHWYCIE' z API' Win32'? Będziesz potrzebował takich rzeczy jak tryb buforowania, bieżący bufor znaków, kodowanie tekstu, itp. Może być możliwe napisanie tego samemu, ale wyobrażam sobie, że może być nieco nudne, aby uzyskać poprawne. – bheklilr

Odpowiedz

11

Nawet w systemie Windows standardowa implementacja plików w System.IO używa deskryptora pliku, a nie win32 HANDLE. Te deskryptory plików są dostarczane przez środowisko wykonawcze C, a nie Windows. Aby przekształcić kod HANDLE w deskryptor pliku, środowisko wykonawcze udostępnia funkcję _open_osfhandle. GHC używa MinGW w systemie Windows, ale MinGW nie udostępnia własnego środowiska wykonawczego C, więc pliki EXE Haskell używają msvcrt.dll.

Użyj interfejsu FFI do importowania _open_osfhandle. Użyj tego, aby przekształcić swój HANDLE w deskryptor pliku, a następnie zadzwoń pod numer fdToHandle, który wydaje się żyć w GHC.IO.Handle.FD.

Nie próbowałem tego.

+1

MinGW nie zapewnia własnego środowiska wykonawczego C, prawda? Większość ludzi wydaje się linkować do (nieobsługiwanego!) Msvcrt.dll, więc doktorzy MS są tak blisko, jak masz zamiar dostać. –

+0

@HarryJohnston Masz rację. Haskell EXEs importuje standardowe funkcje C z msvcrt.dll. – arx

+0

Masz rację, że 'fdToHandle' żyje w' GHC.IO.Handle.FD'. Jednak przyjmuje argument typu 'FD', który jest zdefiniowany w nieużywanym module' GHC.IO.FD'. Ale jak mówisz, 'HANDLE's nie są obsługiwane przez funkcje IO GHC, więc po prostu napiszę funkcje odczytu/zapisu bezpośrednio dla' UCHWYTU ', to jest o wiele łatwiejsze. – bennofs