1

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

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

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

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

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

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

104 549 руб.

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

Я правильно понимаю, что мы можем назвать метод не external а как угодно, например kakugodno и вызывать его потом так: <button onclick="window.kakugodno.TestMethod('Hello')">Click</button>

Да, вы абсолютно правильно поняли! В случае с Borland C++ Builder 6 и компонентом TWebBrowser вы можете назвать ваш метод произвольно (например, kakugodno), но для этого потребуется правильно зарегистрировать свой COM-объект в JavaScript-контексте страницы. Вот как это реализовать:

Минимальный рабочий пример (с произвольным именем)

В файле test.html

HTML
    
<button onclick="window.myCoolObject.TestMethod('Hello from HTML!')">Click me</button>

  

Код (в обработчике OnDocumentComplete)

C++
    
void __fastcall TForm1::CppWebBrowser1DocumentComplete(TObject *Sender, 
    LPDISPATCH pDisp, VARIANT* URL)
{
    // 1. Получаем доступ к window
    IHTMLDocument2* pDoc = CppWebBrowser1->Document;
    IHTMLWindow2* pWindow;
    pDoc->get_parentWindow(&pWindow);
    
    // 2. Создаем и регистрируем свой объект
    IDispatch* pMyObject = (IDispatch*)new TMyCustomObject(); // Ваш COM-объект
    
    // 3. Добавляем в window под именем "myCoolObject"
    VARIANT var;
    VariantInit(&var);
    var.vt = VT_DISPATCH;
    var.pdispVal = pMyObject;
    pMyObject->AddRef();
    
    pWindow->PutProperty(L"myCoolObject", var);
    pWindow->Release();
}

  

Реализация COM-объекта

C++
    
class TMyCustomObject : public IDispatch {
public:
    // IDispatch методы
    STDMETHOD(GetTypeInfoCount)(UINT* pctinfo) { return E_NOTIMPL; }
    STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo) { return E_NOTIMPL; }
    
    STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, 
        UINT cNames, LCID lcid, DISPID* rgDispId)
    {
        if (cNames == 1 && wcscmp(rgszNames[0], L"TestMethod") == 0)
        {
            *rgDispId = 1; // ID для TestMethod
            return S_OK;
        }
        return DISP_E_UNKNOWNNAME;
    }
    
    STDMETHOD(Invoke)(DISPID dispId, ...)
    {
        if (dispId == 1) // TestMethod
        {
            // Получаем параметр 'Hello from HTML!'
            DISPPARAMS* pParams = ...;
            if (pParams->cArgs > 0 && pParams->rgvarg[0].vt == VT_BSTR)
            {
                Form1->Label1->Caption = 
                    "Получено: " + WideString(pParams->rgvarg[0].bstrVal);
            }
            return S_OK;
        }
        return DISP_E_MEMBERNOTFOUND;
    }
    
    // IUnknown методы
    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;
        }
        *ppv = NULL;
        return E_NOINTERFACE;
    }
};

  

Обратите внимание, имя объекта может быть любым, в JavaScript затем к нему можно обратиться приведённым ниже способом.

JavaScript
    
window.myCustomName.Method()
window.superObject.Action()
window.kakugodno.Test()

  

Обязательные шаги:

  • реализовать COM-объект с IDispatch
  • зарегистрировать его через PutProperty
  • обработать вызовы в Invoke
Особенности для IE6: cpp // Для старых версий IE может потребоваться: pWindow->execScript( L"myCoolObject = new ActiveXObject('Your.Object.Name')", L"JavaScript" );

Альтернативный упрощенный способ

Если не требуется поддержка сложных параметров:

C++
    
// В C++:
CppWebBrowser1->ExecScript(
    "function callCpp() { "
    "  try { myGlobalFunction('Hello!'); } "
    "  catch(e) { alert(e); } "
    "}",
    "JavaScript"
);

  
HTML
    
<button onclick="callCpp()">Click</button>

  

Важные предупреждения

Безопасность:

  • не используйте произвольные имена для критически важных функций;
  • всегда проверяйте входные параметры.

Совместимость:

  • работает в IE6+ и C++ Builder 6;
  • не работает в современных браузерах (Chrome/Firefox).

Для внешних сайтов

C++
    
// Требуется добавление в Trusted Sites:
CoInternetCreateSecurityManager()->SetZoneMapping(
    URLZONE_TRUSTED, L"http://example.com", SZM_CREATE);

  

Итог

Вы полностью правы - имя может быть любым (kakugodno, myObject и т.д.), но механизм регистрации COM-объекта остается неизменным. Главное - правильно: