来自F#的EnumWindows

时间:2014-08-21 20:43:59

标签: f# dllimport

我试图从F#调用EnumWindows并得到以下异常:

System.Runtime.InteropServices.MarshalDirectiveException: Cannot marshal 'parameter #1': Generic types cannot be marshaled.

我使用的代码:

module Win32 =
    open System
    open System.Runtime.InteropServices
    type EnumWindowsProc = delegate of (IntPtr * IntPtr) -> bool
    [<DllImport("user32.dll")>]
    extern bool EnumWindows(EnumWindowsProc callback, IntPtr lParam)

    let EnumTopWindows() =
        let callback = new EnumWindowsProc(fun (hwnd, lparam) -> true)
        EnumWindows(callback, IntPtr.Zero)

module Test = 
    printfn "%A" (Win32.EnumTopWindows())

1 个答案:

答案 0 :(得分:5)

这有点微妙,但是当你在委托定义中使用括号时,你明确告诉编译器创建一个带有元组的委托 - 然后interop失败,因为它无法处理元组。如果没有括号,则委托创建为具有两个参数的普通.NET委托:

type EnumWindowsProc = delegate of IntPtr * IntPtr -> bool

然后你还必须改变你的使用方式(因为它现在被视为双参数函数):

let EnumTopWindows() =
    let callback = new EnumWindowsProc(fun hwnd lparam -> true)
    EnumWindows(callback, IntPtr.Zero)