COM与Javascript交互

本文介绍了两种跨语言调用的技术:一是从COM组件中调用JavaScript函数实现页面跳转;二是从JavaScript调用COM对象的方法,触发外部事件。通过具体代码示例展示了如何在不同运行环境中进行交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值