//初始化操作
void Init()
{
try
{
LPOLECLIENTSITE pClientSite = GetClientSite();
if(pClientSite == NULL)
{
return;
}
IServiceProvider *isp = NULL;
//COM对象指针获取一般利用QueryInterface函数
HRESULT hr = pClientSite->QueryInterface(IID_IServiceProvider,
reinterpret_cast<void**>(&isp));
if (FAILED(hr))
{
return;
}
IServiceProvider *isp2 = NULL;
hr = isp->QueryService(SID_STopLevelBrowser,
IID_IServiceProvider,
reinterpret_cast<void**>(&isp2));
isp->Release();
if (FAILED(hr))
{
return;
}
IWebBrowser2* browser = NULL;
hr = isp2->QueryService(SID_SWebBrowserApp,
IID_IWebBrowser2,
reinterpret_cast<void**>(&browser));
isp2->Release();
if (FAILED(hr))
{
return;
}
IHTMLDocument* doc = NULL;
hr=browser->get_Document((IDispatch**)&doc);
browser->Release();
if(FAILED(hr))
{
return;
}
hr=doc->get_Script(&m_script);
doc->Release();
if(FAILED(hr))
{
m_script = NULL;
return;
}
}
catch(...)
{
}
}
//回调js函数
void Test()
{
CComPtr<IDispatch> g_script = NULL; //g_scrip为全局函数, 需要在调用之前获取
//这里得到js函数dispid
CComBSTR bstrMember("js_fun_nane");
DISPID dispid = 0;
HRESULT hr = g_script->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if(FAILED(hr))
{
return;
}
DISPPARAMS dispparams;
memset(&dispparams, 0, sizeof dispparams);
dispparams.cArgs = 4;
dispparams.rgvarg = new VARIANT[dispparams.cArgs];
//回调函数有四个参数
for(int i=0; i < 3; i++)
{
dispparams.rgvarg[i].vt = VT_I4;
}
dispparams.rgvarg[0].lVal = 1;
dispparams.rgvarg[1].lVal = 2;
dispparams.rgvarg[2].lVal = 3;
dispparams.rgvarg[3].vt = VT_BSTR;
dispparams.rgvarg[3].bstrVal = CString(_T("hello world")).AllocSysString();
//dispparams.cNamedArgs = 0;
EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof excepInfo);
//_variant_t Var;
//Var.Clear();
CComVariant varesult;
UINT nArgErr = (UINT)-1;
//调用页面方法
g_script->Invoke(dispid,
IID_NULL,
0,
DISPATCH_METHOD,
&dispparams,
&varesult,
&excepInfo,
&nArgErr);
delete []dispparams.rgvarg;
//判断返回值
if (FAILED(hr))
{
//失败
return "-1";
}
else
{
CString Result;
if (varesult.vt != VT_EMPTY)
{
Result = varesult.bstrVal;
}
else
{
Result = "1";
}
return Result;
}
}