Собственно есть HWND окошечко. При событие WM_CREATE создаю Ole объектик:
IWebBrowser2* pBrowser = NULL;
IOleObject* pOleObject = NULL;
OleCreate(CLSID_WebBrowser, IID_IOleObject, OLERENDER_DRAW, 0, (IOleClientSite*)&h, &oStore, (void**)&pOleObject);
...
pOleObject->DoVerb(OLEIVERB_SHOW, NULL, (IOleClientSite*)&h, 0, hWnd, &rc);
...
pOleObject->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);
pBrowser->put_Left(0);
pBrowser->put_Top(0);
pBrowser->put_Width(rc.right);
pBrowser->put_Height(rc.bottom);
pBrowser->Navigate(L"about:blank", 0, 0, 0, 0);
pBrowser->put_Visible(true);
pBrowser->Release();
Все создаётся просто на ура... НО
после создания окна и до запуска обработчика событий нельзя получить pBrowser->get_Document(&pDispatch) в windows 98
то есть get_Document возвращяет S_OK но pDispatch == NULL
Под WindowsXP все нормально.
HWND hWnd = ::CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, "Window class", "", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 300, 300, 300, 300, NULL, 0, NULL, NULL);
// от тута вот нифига нельзя получить в win98
// hWnd - уже отрисовался и стал активным а OleObject еще не видно
// ole object отрисуется позже и тогда всё можно получить
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
в документации по IOleObject::DoVerb написано:
"When showing a window as a result of DoVerb, it is very important for the object to explicitly call SetForegroundWindow on its editing window. This ensures that the object's window will be visible to the user even if another process originally obscured it. For more information see SetForegroundWindow and SetActiveWindow."
Тобишь я понимаю что надо активизировать hWnd и он отрисует мне OleObject.
Cмотрел Spy-ем какие сообщения получает hWnd и полностью их копировал и посылал до обработчика — и нифига. Изгалялся по-разному. Активизирповал повторно окно, сообщение проходило но на OleObject действия не возымело.
Где у меня ошибка помимо ДНК?
Мой долгий личный опыт общения с IE позволяет мне утверждать, что тот документ, который возвращается в XP сразу после вызова Navigate не совсем полноценный. Уже не помню в чем были грабли, но пользоваться им по нормальному нельзя. Документ соедует запрпшивать после прихода сообщения DocumentComplete. Т.е. порядок действий такой:
1) Создаем WebBrowser и подключаемся к его событиям.
2) Вызываем Navigate
3) Возвращаемся в цикл рассылки сообщений Windows. Это очень важно, т.к. он нужен IE для того чтобы "прочухаться"
4) Ждем событие DocumentComplete
5) Получаем Document
Здравствуйте, al, Вы писали:
al>Мой долгий личный опыт общения с IE позволяет мне утверждать, что тот документ, который возвращается в XP сразу после вызова Navigate не совсем полноценный. Уже не помню в чем были грабли, но пользоваться им по нормальному нельзя. Документ соедует запрпшивать после прихода сообщения DocumentComplete. Т.е. порядок действий такой:
al>1) Создаем WebBrowser и подключаемся к его событиям.
al>2) Вызываем Navigate
al>3) Возвращаемся в цикл рассылки сообщений Windows. Это очень важно, т.к. он нужен IE для того чтобы "прочухаться"
al>4) Ждем событие DocumentComplete
al>5) Получаем Document
Огромнейшее спасибо, отловил DocumentComplete запросил там Document и всё заработало под windows 98.
Мои благодарности незнают границ

А мой личный опыт с embedded browser только 2 дня

и из низ 1,9 с это проблемой
Тоже мучаюсь с IE.
Есть страничка с некоторым количеством ActiveX. При загрузке страницы нужно получить список своих ActiveX у меня получилось.
Но после этого нужно как то получить координаты этого активикса на странице, что бы затем сверху добавить свой behavior для отрисовки дополнительных "связей" между ними на самой страничке.
Если у активикса стоит стиль style="LEFT: 160px; TOP: 120px; POSITION: absolute" то все замечательно, выдергиваем значения координат из интерфейса IHTMLStyle.
А вот если такого стиля нет, то добыть координаты у меня никак не получается
Может сталкивались с этим ? Как можно координаты добыть ?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Нашел сейчас документ один
help://MS.MSDNQTR.2005JAN.1033/ProgIE/workshop/browser/editing/editdesignerimp2.htm
Там есть пример с функцией CAnnotator::OpenCommentEditBox(IHTMLElement* pSrcElem)
Вот если в ней покопаться, то может что и получится.
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
O>Нашел сейчас документ один
O>help://MS.MSDNQTR.2005JAN.1033/ProgIE/workshop/browser/editing/editdesignerimp2.htm
O>Там есть пример с функцией CAnnotator::OpenCommentEditBox(IHTMLElement* pSrcElem)
O>Вот если в ней покопаться, то может что и получится.
Данный способ работает далеко не всегда, и к тому же все равно не получается точно найти координаты активикса

Может кто еще знает как можно сделать ?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Здравствуйте, ilyxan, Вы писали:
I>Собственно есть HWND окошечко. При событие WM_CREATE создаю Ole объектик:
I>I>IWebBrowser2* pBrowser = NULL;
I>IOleObject* pOleObject = NULL;
I>OleCreate(CLSID_WebBrowser, IID_IOleObject, OLERENDER_DRAW, 0, (IOleClientSite*)&h, &oStore, (void**)&pOleObject);
I>...
I>pOleObject->DoVerb(OLEIVERB_SHOW, NULL, (IOleClientSite*)&h, 0, hWnd, &rc);
I>...
I>pOleObject->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);
I>pBrowser->put_Left(0);
I>pBrowser->put_Top(0);
I>pBrowser->put_Width(rc.right);
I>pBrowser->put_Height(rc.bottom);
I>pBrowser->Navigate(L"about:blank", 0, 0, 0, 0);
I>pBrowser->put_Visible(true);
I>pBrowser->Release();
I>
I>Все создаётся просто на ура... НО
У меня татая проблема: надо создать WebBrowser. Импленентацию IOleClientSite и IStorage взял с cwebpage (нераз встречаеться в форуме). Пример работает. Перевел на с++. Вызов OleCreate возвращает "Не могу найти файл". Пробовал перед OleCreate вставить CoLoadLibrary("shdocvw.dll",true), ответ: Класс не зарегистрирован. CoCreateInstance аналогично, только с NULL оказателем на IUnknown.
Что я не так сделал?