这真是让我头疼。
我已经阅读了关于此主题的SO帖子:这里是最相关的,但它没有涉及将委托传递给事件(尽管我本来以为会很简单)。
具体而言,在VS中出现的错误是:
This function value is being used to construct a delegate type whose signature includes a byref argument. You must use an explicit lambda expression taking 2 arguments.
我能找到的最好的错误解释是在Eric Lippert的博客中,但我认为下面已经解决了这个问题。
// Documentation: http://msdn.microsoft.com/en-us/library/aa752084(v=vs.85).aspx
// Don't forget to unwrap the instance before using it.
let mutable ieInstance : option<InternetExplorer> = None
let onDocumentComplete (pDisp : Object) (url : byref<Object>) =
let doc = ieInstance.Value.Document :?> IHTMLDocument2
let window = doc.parentWindow
window.execScript(@"alert('Message added by addon.');") |> ignore
// All of the following underline "DocumentComplete" as the source of the error.
do ieInstance.Value.DocumentComplete.AddHandler(new Handler<byref<Object>>(fun pDisp url -> onDocumentComplete pDisp &url))
do ieInstance.Value.DocumentComplete.AddHandler(fun pDisp url -> onDocumentComplete pDisp &url)
do ieInstance.Value.DocumentComplete.Add(fun pDisp url -> onDocumentComplete pDisp &url)
do ieInstance.Value.DocumentComplete.Add(fun _ _ -> ())
do ieInstance.Value.DocumentComplete.Add(fun (_, _) -> ())
我很感激任何建议!
更新1
我正在引用的库是Interop.SHDocVw,在“Microsoft Internet Controls”中。我还尝试使用SHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler
作为委托类型,但仍然失败。
mshtml
、System
和SHDocVw
的open
语句。 - latkin