Я создал форму и разместил на ней компонент WebBrowser. Затем создал страницу на HTML. Я хочу написать свою функцию в приложении, например, qqq() такую, чтобы она вызывалась со страницы так: window.external.qqq. Можете мне популярно объяснить, что я должен делать? А то я не слишком силен в COM и тем более в .NET, а прогу надо обязательно на C# написать.
12.04.04 15:22: Перенесено модератором из '.NET' — AVK
Здравствуйте, Spiceman, Вы писали:
S>Я создал форму и разместил на ней компонент WebBrowser. Затем создал страницу на HTML. Я хочу написать свою функцию в приложении, например, qqq() такую, чтобы она вызывалась со страницы так: null; о объяснить, что я должен делать? А то я не слишком силен в COM и тем более в .NET, а прогу надо обязательно на C# написать.
Без COM тут по любому не обойтись.
От браузера нужно запрашивать ICustomDoc и передать ему реализацию IDocHostUIHandler (описание в MSDN). Проще всего это делать на MC++, или описать эти интерфейсы на C#.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, TK, Вы писали:
TK>Здравствуйте, Spiceman, Вы писали:
S>>Я создал форму и разместил на ней компонент WebBrowser. Затем создал страницу на HTML. Я хочу написать свою функцию в приложении, например, qqq() такую, чтобы она вызывалась со страницы так: null; о объяснить, что я должен делать? А то я не слишком силен в COM и тем более в .NET, а прогу надо обязательно на C# написать.
TK>Без COM тут по любому не обойтись. TK>От браузера нужно запрашивать ICustomDoc и передать ему реализацию IDocHostUIHandler (описание в MSDN). Проще всего это делать на MC++, или описать эти интерфейсы на C#.
Я полазил по просторам интернета. Сегодня мне повезло. Я нашел описание IDocHostUIHandler на C#. Затем я создал свой класс CustomWebBrowser и унаследовал его от IDocHostUIHandler и AxShDocVw.AxWebBrowser. Переопределил методы интерфесфа. Только вот такое ощущение, что эти методы не работают. Например, что бы я ни написал в GetExternal ничего не происходит. Что не так?
Я написал следующие строки:
private AxSHDocVw.AxWebBrowser axWebBrowser1;
...
DocHostUIHandler DocHostUIHandler = new DocHostUIHandler();
ICustomDoc itfCustomDoc = axWebBrowser1 as ICustomDoc;
itfCustomDoc.SetUIHandler(DocHostUIHandler);
Почему он не находит интерфейс ICustomDoc. Может дело в GUID? Интерфейс я описал так:
[ComVisible(true), ComImport(),
Guid("3050f3f0-98b5-11cf-bb82-00aa00bdce0b"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface ICustomDoc
{
[return: MarshalAs(UnmanagedType.I4)][PreserveSig]
int SetUIHandler([In, MarshalAs(UnmanagedType.Interface)] Object pUIHandler);
}
GUID я взял из MsHtmHst.idl из строчек:
[
object,
uuid(3050f3f0-98b5-11cf-bb82-00aa00bdce0b),
pointer_default(unique),
local
]
Может я чего не понимаю?
С этим я разобрался. Надо было писать:
ICustomDoc itfCustomDoc = axWebBrowser1.Document as ICustomDoc;
Теперь SetUIHandler вызывается, но после происходит какая-то ошибка. Что опять не так?