2014-07-02 11 views
9

Voglio creare una pipe anonima su Windows utilizzando lo CreatePipe di WinAPI tramite la FFI. Questo mi darà un HANDLE (tipo dal pacchetto haskell Win32), ma mi piacerebbe avere un ordinario haskell Handle tale da poter utilizzare le funzioni standard dell'hash di haskell su di esso. Quindi ho bisogno di una funzione di tipo:Converti MANIGLIA per gestire

win32handleToStandardHandle :: HANDLE -> IO Handle 

Come posso implementarlo?

Su linux, posso usare la funzione System.Posix.IOfdToHandle per convertire tra il tipo FD utilizzato dalle chiamate di sistema linux e il tipo standard di haskell. Ma sembra che non ci sia una tale funzione per Windows.

+0

Sembra che "HANDLE" sia solo un sinonimo di tipo: 'type HANDLE = Ptr()'. Non ho idea di come rispondere alla tua domanda ma questo non dà una funzione di conversione molto per lavorare con ...: \ –

+0

Posso vedere che 'HANDLE' è definito come' type HANDLE = Ptr() ', mentre' Handle 'è un tipo di dati algebrico che rappresenta un singolo handle o un handle duplex per RW, che a sua volta è implementato da una struttura di record complessa. Ci sono molte funzioni per ottenere informazioni su un 'HANDLE' dall'API' Win32'? Avrai bisogno di cose come la modalità di buffering, il buffer di char corrente, la codifica del testo, ecc. Potrebbe essere possibile scriverlo da solo, ma immagino che potrebbe essere un po 'noioso per essere corretto. – bheklilr

risposta

11

Anche su Windows l'implementazione standard dei file in System.IO utilizza un descrittore di file, non un win32 HANDLE. Questi descrittori di file sono forniti dal runtime C, non da Windows. Per convertire un HANDLE in un descrittore di file, il runtime fornisce la funzione _open_osfhandle. GHC utilizza MinGW su Windows ma MinGW non fornisce il proprio runtime C, quindi gli EXE di Haskell utilizzano msvcrt.dll.

Utilizzare l'FFI per importare _open_osfhandle. Utilizzalo per convertire il tuo HANDLE in un descrittore di file e quindi chiama fdToHandle, che sembra vivere in GHC.IO.Handle.FD.

Non ho ancora provato questo.

+1

MinGW non fornisce il proprio runtime C, vero? La maggior parte delle persone sembra collegarsi al msvcrt.dll (non supportato!), Quindi i documenti MS sono così vicini come si otterrà. –

+0

@HarryJohnston Hai ragione. EXE Haskell importano le funzioni standard di C da msvcrt.dll. – arx

+0

Hai ragione che 'fdToHandle' risiede in' GHC.IO.Handle.FD'. Tuttavia, prende un argomento del tipo 'FD', che è definito nel modulo non esposto' GHC.IO.FD'. Ma come dici tu, gli "HANDLE" non sono realmente supportati dalle funzioni di GHC IO, quindi scriverò semplicemente le funzioni di lettura/scrittura direttamente per 'HANDLE', che è molto più semplice. – bennofs