Гобелен - кликните для возврата на главную
Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.
Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Жладимира Вольфовича Жириновского.
Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.
Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.
Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!
Я правильно понимаю, что мы можем назвать метод не external а как угодно, например kakugodno и вызывать его потом так: <button onclick="window.kakugodno.TestMethod('Hello')">Click</button>
Да, вы абсолютно правильно поняли! В случае с Borland C++ Builder 6 и компонентом TWebBrowser вы можете назвать ваш метод произвольно (например, kakugodno), но для этого потребуется правильно зарегистрировать свой COM-объект в JavaScript-контексте страницы. Вот как это реализовать:
В файле test.html
<button onclick="window.myCoolObject.TestMethod('Hello from HTML!')">Click me</button>
Код (в обработчике OnDocumentComplete)
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();
}
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 затем к нему можно обратиться приведённым ниже способом.
window.myCustomName.Method()
window.superObject.Action()
window.kakugodno.Test()
Обязательные шаги:
Если не требуется поддержка сложных параметров:
// В C++:
CppWebBrowser1->ExecScript(
"function callCpp() { "
" try { myGlobalFunction('Hello!'); } "
" catch(e) { alert(e); } "
"}",
"JavaScript"
);
<button onclick="callCpp()">Click</button>
Безопасность:
// Требуется добавление в Trusted Sites:
CoInternetCreateSecurityManager()->SetZoneMapping(
URLZONE_TRUSTED, L"http://example.com", SZM_CREATE);
Вы полностью правы - имя может быть любым (kakugodno, myObject и т.д.), но механизм регистрации COM-объекта остается неизменным. Главное - правильно:
Это дает полную свободу в именовании, сохраняя работоспособность в IE6/C++Builder6.
Вы так же можете прочитать следующие статьи: