Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

F# syntax for P/Invoke signature using MarshalAs

I'm unsure of the syntax for this. I'm trying to translate this C# code into F#.

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);
}

This is what I have so far.

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

type IdleTimer =
    [<DllImport("User32.dll")>]
    [<return: MarshalAs(UnmanagedType.Bool)>]
    extern GetLastInputInfo(plii : LASTINPUTINFO ref)
like image 715
gradbot Avatar asked Nov 06 '09 18:11

gradbot


2 Answers

In addition to Brian's comment, it may be worth pointing out that F# extern signatures reflect C signatures fairly faithfully, so that rather than using the [<In>][<Out>] attributes on the reference you can probably just declare the parameter as LASTINPUTINFO* plii, and then pass a reference to a local instance using the && operator when calling the function.

like image 122
kvb Avatar answered Sep 21 '22 12:09

kvb


Honestly I haven't tried to run or use this, but this compiles, and hopefully will steer you in the right direction.

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)
like image 40
Brian Avatar answered Sep 21 '22 12:09

Brian