2009-11-06 6 views
7

Tôi không chắc về cú pháp này. Tôi đang cố dịch mã C# này thành F #.Cú pháp F # cho P/Gọi chữ ký bằng cách sử dụng 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); 
} 

Đây là những gì tôi có cho đến nay.

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

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

Trả lời

8

Thành thật mà nói, tôi chưa thử chạy hoặc sử dụng điều này, nhưng biên dịch này và hy vọng sẽ hướng dẫn bạn đi đúng hướng.

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

Ngoài bình luận của Brian, nó có thể là giá trị chỉ ra rằng F chữ ký # extern phản ánh chữ ký C khá trung thành, do đó thay vì sử dụng [<In>][<Out>] thuộc tính trên tham chiếu, bạn có thể có lẽ chỉ cần khai báo các thông số như LASTINPUTINFO* plii, và sau đó chuyển một tham chiếu đến một cá thể cục bộ bằng cách sử dụng toán tử & & khi gọi hàm.

3

Ngoài nhận xét của kvb, tôi thấy rằng việc khai báo các tham số là con trỏ sẽ làm hỏng công cụ sửa lỗi FSharp Power Tools hiện tại. Bạn có thể sử dụng một số điện thoại IntPtr để thực hiện việc đó:

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