2009-11-06 8 views
7

No estoy seguro de la sintaxis para esto. Estoy tratando de traducir este código C# en F #.F # sintaxis para la firma P/Invoke utilizando 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); 
} 

Esto es lo que tengo hasta ahora.

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

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

Respuesta

8

Sinceramente, no han tratado de ejecutar o utilizar esto, pero esto compila, y se espera que guiarlo en la dirección correcta.

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

Además de comentario de Brian, puede valer la pena señalar que F firmas # extern reflejan C firmas con bastante fidelidad, de modo que en lugar de utilizar los atributos [<In>][<Out>] en la referencia probablemente puede declarar el parámetro como LASTINPUTINFO* plii, y luego pasar una referencia a una instancia local utilizando el operador & & al llamar a la función.

3

Además del comentario de kvb, encontré que declarar parámetros como punteros ensucia el actual motor de refactorización de FSharp Power Tools. Puede usar un IntPtr para evitar eso:

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 
Cuestiones relacionadas