Как в Borland C++ Builder 6 по событию внутри компонента CWebBrowser1 запустить событие в коде C++

Гобелен - кликните для возврата на главную

Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.

Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Жладимира Вольфовича Жириновского.

Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.

Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.

Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!

104 549 руб.

Описание товара

Предположим что у меня в CWebBrowser загружена некоторая страница у которой есть некоторый элемент при клике по которому требуется чтобы были выполнены некоторые действия, например пусть Label1 будет присвоен какой то текст. Как это сделать? Взаимодействие между страницей в TWebBrowser и кодом C++ Builder 6

Для обработки кликов по элементам веб-страницы и выполнения действий в приложении (например, изменения Label1->Caption) нужно:

Подготовка HTML-страницы

Добавьте обработчик клика в ваш HTML-элемент:

HTML
    
<button onclick="window.external.OnButtonClick('параметр')">Нажми меня</button>

  

Реализация IDispatch интерфейса (в вашем проекте C++ Builder)

Создайте класс для обработки событий:

C++
    
// В заголовочном файле (например, WebBrowserEventHandler.h)
class TWebBrowserEventHandler : public TObject, public IDispatch
{
public:
    // IDispatch methods
    STDMETHOD(GetTypeInfoCount)(unsigned int* pctinfo) { return E_NOTIMPL; }
    STDMETHOD(GetTypeInfo)(unsigned int iTInfo, LCID lcid, ITypeInfo** ppTInfo) { return E_NOTIMPL; }
    STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, unsigned int cNames, LCID lcid, DISPID* rgDispId) 
    {
        if (cNames == 1 && wcscmp(rgszNames[0], L"OnButtonClick") == 0)
        {
            *rgDispId = 1;
            return S_OK;
        }
        return DISP_E_UNKNOWNNAME;
    }
    
    STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
                      DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, unsigned int* puArgErr)
    {
        if (dispIdMember == 1) // OnButtonClick
        {
            if (pDispParams->cArgs > 0 && pDispParams->rgvarg[0].vt == VT_BSTR)
            {
                WideString param = pDispParams->rgvarg[0].bstrVal;
                Form1->Label1->Caption = "Получен параметр: " + param;
            }
            return S_OK;
        }
        return DISP_E_MEMBERNOTFOUND;
    }
    
    // IUnknown methods
    STDMETHOD_(ULONG, AddRef)() { return 1; }
    STDMETHOD_(ULONG, Release)() { return 1; }
    STDMETHOD(QueryInterface)(REFIID riid, void** ppv)
    {
        if (riid == IID_IDispatch || riid == IID_IUnknown)
        {
            *ppv = static_cast<IDispatch*>(this);
            return S_OK;
        }
        return E_NOINTERFACE;
    }
};

  

Подключите обработчик к WebBrowser:

C++
    
// В Unit1.cpp
TWebBrowserEventHandler* handler;
      
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    handler = new TWebBrowserEventHandler();
    CppWebBrowser1->RegisterAsBrowser = true;
    
    // Получаем интерфейс документа
    IWebBrowser2* wb = CppWebBrowser1->DefaultInterface;
    IDispatchPtr docDispatch = wb->GetDocument();
    
    // Устанавливаем наш обработчик
    IDispatchEx* docEx;
    if (docDispatch->QueryInterface(IID_IDispatchEx, (void**)&docEx) == S_OK)
    {
        docEx->SetPropertyByName(L"external", (VARIANT*)&handler);
        docEx->Release();
    }
}

  

Альтернативный способ (через JavaScript и COM)

Если предыдущий метод сложен, можно использовать более простой подход.

HTML
    
<button onclick="window.external.SetLabelText('Новый текст')">Обновить Label</button>

  
C++
    
// Объявите в классе формы:
TComObjectFactory* factory;
      
// В FormCreate:
factory = new TComObjectFactory(CLSID_NULL, __classid(TForm1), "", "", 
                               OLEMISC_SIMPLEFRAME|OLEMISC_ACTSLIKELABEL,
                               tmApartment);
      
// Добавьте метод в класс формы:
STDMETHODIMP TForm1::SetLabelText(BSTR text)
{
    Label1->Caption = WideString(text);
    return S_OK;
}

  

Самый простой способ (если страница ваша)

Используйте Navigate с javascript:

C++
    
// В обработчике события нажатия кнопки:
CppWebBrowser1->Navigate("javascript:window.external.SetLabelText('Текст')");

  

Важные замечания

Для работы window.external необходимо установить RegisterAsBrowser = true.

В IE6 могут быть ограничения безопасности - убедитесь что страница загружена из доверенной зоны.

Для сложных взаимодействий лучше использовать IOleCommandTarget интерфейс.

Выберите подход в зависимости от сложности вашей задачи. Первый вариант наиболее универсален, последний - самый простой для быстрой реализации.

Другие товары

Вы так же можете прочитать следующие статьи: