我试图从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())
答案 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)