AddFavorite не работает при реализации IShellUIHelper на c#

#c# #com #external #bho #comexception

#c# #com #внешний #bho #comexception

Вопрос:

Я создаю дополнение IE и хочу «быть» внешним объектом. поэтому я использую SetUIHandler для установки моего класса в качестве UiHandler.

Я реализую IDocHostUIHandler (ссылающийся на Microsoft Internet Controls (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 (т.Е. Ожидать его от 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); и это все еще не работает.

кто-нибудь может мне помочь с этим?

Спасибо,

Omri

Комментарии:

1. Вызовите исключение NotImplementException, оно преобразуется в E_NOTIMPL.

Ответ №1:

Вам необходимо передать вызовы членов IShellUIHelper и IShellUIHelper2 вспомогательному объекту пользовательского интерфейса оболочки в вашем внешнем объекте.

Javascript вызывает элементы вашего внешнего объекта через IDispatch, поэтому вам нужно убедиться, что вы правильно реализовали Invoke и GetIDsOfNames . С точки зрения программирования управляемого кода это означает, что вам нужно иметь правильную сигнатуру метода в вашем классе и добавить правильный [DispId] к вашим методам.

В проекте csexwb2 есть объявление IShellUIHelper, которое вы можете использовать в качестве ссылки.