activeX
От: Vasiliy Vladimirovich Safronov  
Дата: 25.02.02 13:27
Оценка:
Привет всем .
Поскажите пожалуйста как получить доступ из activeX к страничке в которую он включен.
Например я вызываю функцию моего обьекта в параметрах даю id тага(iframe,div и.т.д)
А фукция выводит MessageBox показывающий содержимое тага.(innerText).

За любые советы или ссылки буду очень благодарен.
Re: activeX
От: Sashko Россия http://www.dc.baika.ru/
Дата: 26.02.02 02:22
Оценка:
Здравствуйте Vasiliy Vladimirovich Safronov, Вы писали:

VVS>Поскажите пожалуйста как получить доступ из activeX к страничке в которую он включен.

VVS>Например я вызываю функцию моего обьекта в параметрах даю id тага(iframe,div и.т.д)
VVS>А фукция выводит MessageBox показывающий содержимое тага.(innerText).

В общем тебе нужно добраться вот до такого интерфейса IWebBrowser2. Для контрола, получить его можно через IOleClientSite, который передается контролу либо посредством вызова IOleObject::SetClientSite либо IObjectWithSite::SetSite

//@//////////////////////////////////////////////////////////////////////////
// CCtrl IObjectWithSiteImpl

STDMETHODIMP CCtrl::SetSite(IUnknown* pUnkSite)
{
    HRESULT hr;

    if (FAILED(hr = IObjectWithSiteImpl<CAlterEGoCtrl>::SetSite(pUnkSite)))
        return hr;

    if (NULL == pUnkSite)
    {
        ATLASSERT(m_webBrowser);

        if (m_webBrowser)
        {
            DispEventUnadvise(m_webBrowser);
            m_webBrowser.Release();
        }
        return    S_OK;
    }

    IServiceProvider *pSP = NULL;

    if (FAILED(hr = pUnkSite->QueryInterface(IID_IServiceProvider, (void**)&pSP)))
        return hr;

    hr = pSP->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&m_webBrowser);
    pSP->Release();
    if (FAILED(hr))                            
        return hr;

    if (SUCCEEDED(hr = DispEventAdvise(m_webBrowser)))
        return S_OK;

    m_webBrowser.Release();
    return hr;
}


После того как у тебя есть IWebBrowser2, через IWebBrowser2::get_Document добирается до HTMLDocument'а, и уже через него получаешь доступ к DHTML.

VVS>За любые советы или ссылки буду очень благодарен.


http://msdn.microsoft.com/workshop/components/activex/buildax.asp
http://msdn.microsoft.com/workshop/components/com/com_node_entry.asp
http://msdn.microsoft.com/workshop/browser/prog_browser_node_entry.asp

PS:
Подключение к событиям объектной модели DHTML при использовании WebBrowser-control

Автор: Тимофей Чадов
Источник: RSDN Magazine #0

http://www.rsdn.ru/mag/?0002/dhtmlspy.xml
Re[2]: activeX
От: Vasiliy Vladimirovich Safronov  
Дата: 26.02.02 06:56
Оценка:
Здравствуйте Sashko, Вы писали:


S>В общем тебе нужно добраться вот до такого интерфейса IWebBrowser2. Для контрола, получить его можно через IOleClientSite, который передается контролу либо посредством вызова IOleObject::SetClientSite либо IObjectWithSite::SetSite


S>//@//////////////////////////////////////////////////////////////////////////
S>// CCtrl IObjectWithSiteImpl


S>STDMETHODIMP CCtrl::SetSite(IUnknown* pUnkSite)
S>{
S>    HRESULT hr;

S>    if (FAILED(hr = IObjectWithSiteImpl<CAlterEGoCtrl>::SetSite(pUnkSite)))
S>        return hr;

S>    if (NULL == pUnkSite)
S>    {
S>        ATLASSERT(m_webBrowser);

S>        if (m_webBrowser)
S>        {
S>            DispEventUnadvise(m_webBrowser);
S>            m_webBrowser.Release();
S>        }
S>        return    S_OK;
S>    }

S>    IServiceProvider *pSP = NULL;

S>    if (FAILED(hr = pUnkSite->QueryInterface(IID_IServiceProvider, (void**)&pSP)))
S>        return hr;

S>    hr = pSP->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2, (void**)&m_webBrowser);
S>    pSP->Release();
S>    if (FAILED(hr))                            
S>        return hr;

S>    if (SUCCEEDED(hr = DispEventAdvise(m_webBrowser)))
S>        return S_OK;

S>    m_webBrowser.Release();
S>    return hr;
S>}


Не совсем понял этот механизм.Если не трудно пожалуйста обьясни.
Как сейчас это понимаю:При создании моего обьета(<object и.т.д>) эксплорер запрошивает
через мой интерфейс , интерфейс IOleObject либо IObjectWithSite потом в случае успеха
,т.е если они у меня реализованы,пытается вызвать метод SetSite в единственный параметр
которого передает указатель на свой IOleClientSite ,потом через него мы можем получить
наш IWebBrowser2.

Несовсем понял твой исходный код верней его совсем не понял
(IObjectWithSiteImpl<CAlterEGoCtrl>::SetSite(pUnkSite)-руским языком чайнику можно обьяснить
что это выражение делает,
еще не понял почему нельзя сразу запросить IWebBrowser2? а сначала надо IServiceProvider(??)
а потом на IWebBrowser2 .

,),где про ето можно почитать ,
желательно на нашенском.
Ты не представляешь себе каким я полнейшим чайником себя почувсвовал(помогай плиз выбираться).

S>После того как у тебя есть IWebBrowser2, через IWebBrowser2::get_Document добирается до HTMLDocument'а, и уже через него получаешь доступ к DHTML.

Это понятно.

Заранее благодарен.
Re[3]: activeX
От: Sashko Россия http://www.dc.baika.ru/
Дата: 26.02.02 10:42
Оценка:
Здравствуйте Vasiliy Vladimirovich Safronov, Вы писали:

VVS>Не совсем понял этот механизм.Если не трудно пожалуйста обьясни.

VVS>Как сейчас это понимаю:При создании моего обьета(<object и.т.д>) эксплорер запрошивает
VVS>через мой интерфейс , интерфейс IOleObject либо IObjectWithSite потом в случае успеха
VVS>,т.е если они у меня реализованы,пытается вызвать метод SetSite в единственный параметр
VVS>которого передает указатель на свой IOleClientSite ,потом через него мы можем получить
VVS>наш IWebBrowser2.

Все верно. Ты реализуешь один из них (IOleObject когда тебе нужен полноценный контрол и IObjectWithSite когда тебе необходим только обжект сайт объект). Через метод Set(Client)Site, контейнер передает тебе IOleClientSite.

VVS>Несовсем понял твой исходный код верней его совсем не понял

VVS>(IObjectWithSiteImpl<CAlterEGoCtrl>::SetSite(pUnkSite)-руским языком чайнику можно обьяснить
VVS>что это выражение делает,

Извиняюсь, не везде подправил ;) нужно было написать

IObjectWithSiteImpl<CCtrl>::SetSite(pUnkSite);


и сказать, что CCtrl это класс контрола, плюс заметить что он наследует IObjectWithSiteImpl (реализацию можешь посмотреть в исходниках ATL). Вызов IObjectWithSiteImpl<CCtrl>::SetSite(pUnkSite), означает ни что иное, как вызов метода базового класса.

VVS>еще не понял почему нельзя сразу запросить IWebBrowser2? а сначала надо IServiceProvider(??)

VVS>а потом на IWebBrowser2.

У IOleClientSite нельзя попросить IWebBrowser2, так как ClientSite объект это не браузер, и не он реализует интерфейс IWebBrowser2. Его реализует сам IE, который является контейнером конрола. Поэтому, в случая кода ты получаешь IOleClientSite через IOleObject::SetClientSite, можно сделать следующее (взято от сюда http://msdn.microsoft.com/workshop/components/activex/buildax.asp)

Accessing Dynamic HTML
Internet Explorer 4.0 allows components to access the Dynamic HTML (DHTML) object model of the document in which the control is hosted. All the capabilities of the object model are available to the control, allowing it to both read and modify the document content. If a control supports either the IObjectWithSite or IOleObject interface, accessing the object model is very simple and consists of the following two steps:
1. Call IOleClientSite::GetContainer. This returns the IOleContainer interface of the host of the control.
2. Call QueryInterface on the IOleContainer interface for the IHTMLDocument2 interface.

// Get the document.
CComPtr<IOleContainer> spContainer; 
m_spClientSite->GetContainer(&spContainer); 
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spDoc(spContainer); 
if (spDoc)
    spDoc->put_bgColor(CComBSTR(_T("pink")));


Теперь про IObjectWithSite. Скорей всего, можно получить IOleClientSite сделав QI от IUnknown который тебе передают в IObjectWithSite::SetSite, и тогда сделать так же как написано выше. Но что то я стал сомневаться ;). Проверь. Второй способ, это попросить IServiceProvider, как писал в предыдущем сообщение, и уже через него получить IWebBrowser2. Узнал про это, скорей всего, из примера. В семплах к PlatformSDK, есть вот такой проект ...\psdk\samples\Web\components\objvw

//-------------------------------------------------------------------------
// Readme.txt
//-------------------------------------------------------------------------
// Objvw: A sample that illustrates using IE's Automation and scripting interfaces
// from a contained control
//-------------------------------------------------------------------------


Там делается похожим образом. Но, по моему, я это видел в каком-то другом, давно дело было. Почитай еще в MSDN про механизм ServiceProvider.

VVS>,),где про ето можно почитать ,

VVS>желательно на нашенском.

ссылки я уже писал, а про на нашенском, к сожалению не знаю.
Re[2]: activeX
От: Vasiliy Vladimirovich Safronov  
Дата: 27.02.02 05:44
Оценка:
Здравствуйте Sashko.
Все понял ,огромнейшее спасибо.
И еще если можно 1 вопросик:
В Html коде я вызываю так myScriptObj.PrintX(ifr.document.body.innerText);
и вываливается MessageBox например с текстом во фрейме ,здесь вопрос,
могу ли я передать id , а у себя в функции работать как с обьектом или мне
всетаки придется принимать этот id как строку ,а потом получив указатель
на документ описанными выше способами искать в нем по id этот элемент.
Re[3]: activeX
От: Sashko Россия http://www.dc.baika.ru/
Дата: 27.02.02 06:49
Оценка:
Здравствуйте Vasiliy Vladimirovich Safronov, Вы писали:

VVS>В Html коде я вызываю так myScriptObj.PrintX(ifr.document.body.innerText);

VVS>и вываливается MessageBox например с текстом во фрейме ,здесь вопрос,
VVS>могу ли я передать id , а у себя в функции работать как с обьектом или мне
VVS>всетаки придется принимать этот id как строку ,а потом получив указатель
VVS>на документ описанными выше способами искать в нем по id этот элемент.

myScriptObj.PrintX(document.all(idOfSomeElement));


Можно передать сразу объект DHTML'ля. Ты получишь IDispatch а уже с него QI'ерь нужный интерфейс, например IHTMLElement.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.