#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, которое вы можете использовать в качестве ссылки.