使用MarshalAs进行P/Invoke签名的F#语法

gra*_*bot 7 pinvoke winapi f# marshalling

我不确定这个的语法.我正在尝试将这个C#代码翻译成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);
}
Run Code Online (Sandbox Code Playgroud)

这就是我到目前为止所拥有的.

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

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

kvb*_*kvb 10

除了Brian的评论之外,值得指出的是F#extern签名相当忠实地反映了C签名,因此不是使用[<In>][<Out>]引用上的属性,而是可以将参数声明为LASTINPUTINFO* plii,然后将引用传递给本地实例在调用函数时使用&&运算符.


Bri*_*ian 8

老实说,我没有尝试过运行或使用它,但这会编译,并希望能引导你朝着正确的方向前进.

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)
Run Code Online (Sandbox Code Playgroud)