2009-11-06 9 views
7

Non sono sicuro della sintassi per questo. Sto cercando di tradurre questo codice C# in F #.Sintassi F # per firma P/Invoke utilizzando MarshalAs

struct LASTINPUTINFO 
{ 
    public uint cbSize; 
    public uint dwTime; 
} 

public class IdleTimer 
{ 
    [DllImport("User32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 
} 

Questo è quello che ho finora.

type LASTINPUTINFO = { 
    cbSize : UInt32; 
    dwTime : UInt32; 
} 

type IdleTimer = 
    [<DllImport("User32.dll")>] 
    [<return: MarshalAs(UnmanagedType.Bool)>] 
    extern GetLastInputInfo(plii : LASTINPUTINFO ref) 

risposta

8

Onestamente non hanno cercato di eseguire o utilizzare questo, ma questo compila e si spera orientare nella giusta direzione.

open System 
open System.Runtime.InteropServices 

[<Struct>] 
type LASTINPUTINFO = 
    val cbSize : UInt32 
    val dwTime : UInt32 

module IdleTimer = 
    [<DllImport("User32.dll")>] 
    extern [<MarshalAs(UnmanagedType.Bool)>] bool GetLastInputInfo([<In>][<Out>] LASTINPUTINFO plii) 
10

Oltre al commento di Brian, può valere la pena sottolineare che F firme # esternato riflettono le firme C abbastanza fedelmente, in modo che invece di usare gli attributi [<In>][<Out>] sul riferimento probabilmente si può solo dichiarare il parametro come LASTINPUTINFO* plii, quindi passare un riferimento a un'istanza locale utilizzando l'operatore & & quando si chiama la funzione.

3

In aggiunta al commento di kvb, ho trovato che dichiarare i parametri come puntatori incasina l'attuale motore refact di FSharp Power Tools. È possibile utilizzare un IntPtr per aggirare il problema:

open System 
open System.Runtime.InteropServices 
open Microsoft.FSharp.NativeInterop 

[<Struct>] 
type LASTINPUTINFO = 
    val mutable cbSize : uint32 
    val dwTime : uint32 

[<DllImport("user32.dll")>] 
extern bool GetLastInputInfo(IntPtr p) 

let getLastInputTime() = 
    let mutable time = LASTINPUTINFO(cbSize = 8u) 
    GetLastInputInfo(NativePtr.toNativeInt &&time) |> ignore 
    time.dwTime 
Problemi correlati