Гобелен - кликните для возврата на главную
Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.
Так почему бы не начать использовать обход блокировки YouTube при том что техническая возможность используя расширение nikolaevevge для браузера Mozilla Firefox уже появилась, а объем полезной(и не очень) информации на видеохостинге YouTube, по мнению некоторых диванных экспертов, меньше не стал.
Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Владимира Вольфовича Жириновского.
Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.
На очередном конкурсе танцев, школьница отлично выступила.
Вот та самая информация: программа для продвижения канала YouTube, эта информация выложена уже несколько лет, при этом просмотров не много, а метод который описан в данном видео действительно помогает продвигать видео в YouTube.
Начал разбираться с информацией которая находится в 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.
Вы так же можете прочитать следующие статьи: