JS調用C++,通過設置DIID_HTMLDocumentEvents事件,來捕獲HTMLWINDOW上的事件,再通過事件對象的get_srcElement得到事件源,從而得到指定元素對象,從而獲取元素的信息得到腳本傳過來的數據,來進行調用
還可以通過window對象的IDispatchEx接口來動態的增加一個元素,提供一個IDISPATCH接口給JS去調用
還可以通擴展IDocHostUIHandler接口來提供window.External來供腳本調用
這些利用也可以擴展到IActiveScript接口
1 hr = pdispexWindow->GetDispID(L"kws_checkVirus", fdexNameCaseSensitive, &kws_checkVirusId);
2
3 if (FAILED(hr))
4 {
5 hr = pdispexWindow->GetDispID(L"kws_checkVirus", fdexNameEnsure, &kws_checkVirusId);
6
7 if (FAILED(hr))
8 goto exit0;
9
10 IDispatch* pkws_checkVirus = new kws_checkVirus;
11 DISPPARAMS pParams = {0}, pParamsNo = {NULL, NULL, 0, 0};
12 VARIANT varkws_checkVirus;
13 DISPID dispkws_checkVirus = DISPATCH_PROPERTYPUT;
14 VariantInit(&varkws_checkVirus);
15 varkws_checkVirus.vt = VT_DISPATCH;
16 varkws_checkVirus.pdispVal = pkws_checkVirus;
17
18 pParams.rgvarg = &varkws_checkVirus;
19 pParams.rgdispidNamedArgs = &dispkws_checkVirus;
20 pParams.cArgs = 1;
21 pParams.cNamedArgs = 1;
22
23 hr = pdispexWindow->Invoke(
24 kws_checkVirusId,
25 IID_NULL,
26 LOCALE_SYSTEM_DEFAULT,
27 DISPATCH_PROPERTYPUT|DISPATCH_PROPERTYPUTREF,
28 &pParams,
29 NULL,
30 NULL,
31 NULL);
32 if (SUCCEEDED(hr))
33 hr = e_NEW;
34
35 }
C++調用JS通過IHTMLDocument的get_Script,然后再GetIdOfNames得ID,再INVOKE來調指定的函數,還可以調用execscript來執行腳本