0

我正在构建一个 IE 插件,我想“成为”外部对象。因此我使用 SetUIHandler 将我的类设置为 UIHandler。

我正在实现 IDocHostUIHandler(引用 Microsoft Internet 控件(COM 对象))并在 GetExternal 中返回我的类:

public void GetExternal(out object ppDispatch)

{

    ppDispatch = this;

}

这很好用。任何其他选项我都不感兴趣,所以我需要返回 E_NOTIMPL。

例如:

public void TranslateAccelerator(ref tagMSG lpmsg, ref Guid pguidCmdGroup, uint nCmdID)

{

    Marshal.ThrowExceptionForHR((int)WinAPI.HRESULT.E_NOTIMPL);

}

效果很好,但我还需要实现 IShellUIHelper(IE 期望它来自 UIHandler)。

然后当我实现添加到收藏夹时:

public void AddFavorite(string URL, ref object Title)
{
    Marshal.ThrowExceptionForHR((int)WinAPI.HRESULT.E_NOTIMPL); 
}

它不起作用(js得到了错误)。

当我尝试在 C++ 中做同样的事情并将 E_NOTIMPL 作为返回值返回时,一切都很好:

STDMETHODIMP CMyClass::AddToFavoritesBar(BSTR URL, BSTR Title, VARIANT *Type)
{
    return E_NOTIMPL;
}

我也尝试用替换Marshal.ThrowExceptionForHR((int)WinAPI.HRESULT.E_NOTIMPL);throw new COMException("", (int)WinAPI.HRESULT.E_NOTIMPL);,它仍然不起作用。

任何人都可以帮助我吗?

谢谢,

暗里

4

1 回答 1

1

您需要将对 IShellUIHelper 和 IShellUIHelper2 成员的调用中继到外部对象中的shell UI 帮助器对象。

Javascript 通过 IDispatch 调用外部对象的成员,因此您需要确保已正确实现 Invoke 和 GetIDsOfNames。就托管代码编程而言,这意味着您需要在您的类中拥有正确的方法签名并将正确的 [DispId] 添加到您的方法中。

csexwb2 项目中有一个 IShellUIHelper 声明,您可以将其用作参考。

于 2011-10-18T21:22:38.883 回答