Как в Borland C++ Builder 6 разместить код в заголовочном файле(например, WebBrowserEventHandler.h) и как затем подключить его к проекту

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

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

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

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

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

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

104 549 руб.

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

Вы пишите " В заголовочном файле (например, WebBrowserEventHandler.h)", как именно это делать в IDE Borland C++ Buildet 6 и нужно ли как то затем подключать написанное к проекту.

Подключение обработчика событий WebBrowser в Borland C++ Builder 6

Создание нового заголовочного файла

  • В IDE нажмите File → New → Header File (или Ctrl+N)
  • Сохраните файл как WebBrowserEventHandler.h (File → Save)
  • Вставьте код класса (из предыдущего ответа) в этот файл

Подключение к проекту

Откройте ваш модуль формы (например, Unit1.cpp)

В самом верху, после других #include, добавьте:

C++
    
#include "WebBrowserEventHandler.h"

  

Полная пошаговая реализация:

Создаем класс обработчика:

C++
    
// WebBrowserEventHandler.h
#ifndef WEBBROWSEREVENTHANDLER_H
#define WEBBROWSEREVENTHANDLER_H
      
#include <ocidl.h>  // Для IDispatch
      
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);
    STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
                      DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, unsigned int* puArgErr);
    
    // IUnknown methods
    STDMETHOD_(ULONG, AddRef)() { return 1; }
    STDMETHOD_(ULONG, Release)() { return 1; }
    STDMETHOD(QueryInterface)(REFIID riid, void** ppv);
};
      
#endif

  

Реализация методов (в Unit1.cpp)

C++
    
// Добавьте после #include, но до кода формы
STDMETHODIMP TWebBrowserEventHandler::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;
}
      
STDMETHODIMP TWebBrowserEventHandler::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;
}
      
STDMETHODIMP TWebBrowserEventHandler::QueryInterface(REFIID riid, void** ppv)
{
    if (riid == IID_IDispatch || riid == IID_IUnknown)
    {
        *ppv = static_cast<IDispatch*>(this);
        return S_OK;
    }
    return E_NOINTERFACE;
}

  

Инициализация в форме:

В заголовочном файле формы (Unit1.h):

C++
    
private: // Добавьте в private-секцию класса формы
    TWebBrowserEventHandler* handler;
      
    В обработчике FormCreate:
      
cpp
      
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    handler = new TWebBrowserEventHandler();
    CppWebBrowser1->RegisterAsBrowser = true;
    
    IWebBrowser2* wb = CppWebBrowser1->DefaultInterface;
    IDispatchPtr docDispatch = wb->GetDocument();
    
    if (docDispatch != NULL)
    {
        IDispatchEx* docEx;
        if (docDispatch->QueryInterface(IID_IDispatchEx, (void**)&docEx) == S_OK)
        {
            VARIANT var;
            VariantInit(&var);
            var.vt = VT_DISPATCH;
            var.pdispVal = handler;
            docEx->SetPropertyByName(L"external", &var);
            docEx->Release();
        }
    }
}

  

В деструкторе формы

C++
    
__fastcall TForm1::~TForm1()
{
    delete handler;
}

  

Настройка проекта

Убедитесь, что в настройках проекта (Project → Options):

  • в разделе "Directories/Conditionals" указаны пути к Windows SDK;
  • в "Packages" подключен "Internet Components".

Для работы COM необходимо инициализировать библиотеку

C++
    
// В начале WinMain (в файле проекта)
CoInitialize(NULL);
// В конце WinMain
CoUninitialize();

  

Важно