1、COM调用Javascript函数
void CWebShareView::GoToPage(OLECHAR* pszFunct, UINT nCurSel)
{
HRESULT hr;
LPDISPATCH pDisp = GetHtmlDocument();
IHTMLDocument2* phd=NULL;
hr = pDisp->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&phd);
if (SUCCEEDED(hr) && phd)
{
IDispatch *pDispScript = NULL;
phd->get_Script(&pDispScript);
if (SUCCEEDED(hr) && pDispScript)
{
DISPID dispid; // LOCALE_USER_DEFAULT
//OLECHAR *pszFunct = L"GoToPrevSld";
hr = pDispScript->GetIDsOfNames(IID_NULL, &pszFunct, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if(SUCCEEDED(hr))
{
EXCEPINFO excepInfo;
DISPPARAMS dispparams;
memset(&dispparams, 0, sizeof dispparams);
dispparams.cArgs = 1;
dispparams.cNamedArgs = 0;
dispparams.rgvarg = new VARIANT[1];
dispparams.rgvarg[0].vt = VT_UINT;
dispparams.rgvarg[0].uintVal = nCurSel;
VARIANT varResult;
UINT nArgErr = (UINT)-1;
// initialize to invalid arg
hr = pDispScript->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD,
&dispparams, &varResult, &excepInfo, &nArgErr);
delete[] dispparams.rgvarg;
}
pDispScript->Release();
}
phd->Release();
}
pDisp->Release();
}
2、Javascript调用COM
function gotoPage(page) {
if (page != g_pageIndex) {
var aLi = document.getElementById("sidebar").getElementsByTagName("li");
if (g_pageIndex > 0)
aLi[g_pageIndex-1].className = "";
document.getElementById("docbody").src="pages/"+page+".JPG";
g_pageIndex = page;
aLi[g_pageIndex-1].className = "hover";
// 这里需要想办法让上层应用知道
if (external)
{
try
{
external.JsEvnet(oOutline.outline[page-1], page);
}
catch(e){}
}
}
}
BEGIN_DISPATCH_MAP(CWebShareView, CHtmlView)
DISP_FUNCTION(CWebShareView, "JsEvnet", JsEvnet, VT_BOOL, VTS_BSTR VTS_I4)
END_DISPATCH_MAP()