mfc操作浏览器(1)——执行超链接按钮

本文详细介绍了如何在一个复杂的HTML页面中通过遍历框架结构找到特定名称的框架实例,涉及了JavaScript操作DOM、框架间交互及遍历框架集合等关键技术。

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


	CComQIPtr<IHTMLDocument2> pDoc = m_WebBrowser.get_Document();
	IHTMLFramesCollection2 *pCol = NULL;
	HRESULT hr = pDoc->get_frames(&pCol);       //取得分贞的frame数组

	ASSERT(SUCCEEDED(hr));
	long FrameNum1;
	hr = pCol->get_length(&FrameNum1);			//获取最外面的框架个数
	VARIANT vFrame, vIndex;
	IHTMLDocument2 *pDoc2 = NULL;				//我们要找的框架

	for (int i = 0; i < FrameNum1; i++)
	{
		vIndex.vt = VT_I4;    vIndex.lVal = i;          //准备取得第0号贞
		hr = pCol->item(&vIndex, &vFrame);
		ASSERT(SUCCEEDED(hr));

		//取得的这个接口指针,其实是IHTMLWindow2的接口指针。
		IHTMLWindow2 *pWin = (IHTMLWindow2 *)vFrame.pdispVal;
		hr = pWin->get_document(&pDoc2);
		ASSERT(SUCCEEDED(hr));

		BSTR bFramName = NULL;
		hr = pWin->get_name(&bFramName);
		ASSERT(SUCCEEDED(hr));

		if (szFrameName == CString(bFramName))
		{
			SysFreeString(bFramName);
			return pDoc2;
		}
		else
		{
			IHTMLFramesCollection2 *pCol3 = NULL;

			hr = pDoc2->get_frames(&pCol3);				//取得分贞的frame数组
			ASSERT(SUCCEEDED(hr));

			long FrameNum2;
			hr = pCol3->get_length(&FrameNum2);			//获取最外面的框架个数

			VARIANT vFrame, vIndex;
			IHTMLDocument2 *pDoc3 = NULL;				//我们要找的框架
			for (int i = 0; i < FrameNum2; i++)
			{
				vIndex.vt = VT_I4;    vIndex.lVal = i;          //准备取得第0号贞
				hr = pCol3->item(&vIndex, &vFrame);
				ASSERT(SUCCEEDED(hr));

				//取得的这个接口指针,其实是IHTMLWindow2的接口指针。
				IHTMLWindow2 *pWin1 = (IHTMLWindow2 *)vFrame.pdispVal;
				hr = pWin1->get_document(&pDoc3);
				ASSERT(SUCCEEDED(hr));

				BSTR bFramName = NULL;
				hr = pWin1->get_name(&bFramName);
				ASSERT(SUCCEEDED(hr));
				if (szFrameName == CString(bFramName))
				{
					SysFreeString(bFramName);
					return pDoc3;
				}
				else
				{
					IHTMLFramesCollection2 *pCol3 = NULL;

					hr = pDoc3->get_frames(&pCol3);				//取得分贞的frame数组
					ASSERT(SUCCEEDED(hr));

					long FrameNum2;
					hr = pCol3->get_length(&FrameNum2);			//获取最外面的框架个数

					VARIANT vFrame, vIndex;
					IHTMLDocument2 *pDoc4 = NULL;				//我们要找的框架
					for (int i = 0; i < FrameNum2; i++)
					{
						vIndex.vt = VT_I4;    vIndex.lVal = i;          //准备取得第0号贞
						hr = pCol3->item(&vIndex, &vFrame);
						ASSERT(SUCCEEDED(hr));

						//取得的这个接口指针,其实是IHTMLWindow2的接口指针。
						IHTMLWindow2 *pWin1 = (IHTMLWindow2 *)vFrame.pdispVal;
						hr = pWin1->get_document(&pDoc4);
						ASSERT(SUCCEEDED(hr));

						BSTR bFramName = NULL;
						hr = pWin1->get_name(&bFramName);
						ASSERT(SUCCEEDED(hr));
						if (szFrameName == CString(bFramName))
						{
							SysFreeString(bFramName);
							return pDoc4;
						}
					}
				}
			}
		}

	}

IHTMLDocument2 *pDoc2 = NULL; //我们要找的框架pDoc2 = FindFrame(L"mainFrame");if (pDoc2){CComQIPtr<IDispatch> pDisp;HRESULT hr = pDoc2->get_Script(&pDisp);if (SUCCEEDED(hr)){TCHAR* szRs = L"formsubmit";DISPID dispid;HRESULT hr = pDisp->GetIDsOfNames(IID_NULL, &szRs, 1,LOCALE_SYSTEM_DEFAULT, &dispid);if (SUCCEEDED(hr)){DISPPARAMS dispparams;memset(&dispparams, 0, sizeof dispparams);dispparams.cArgs = 0;//要传递的参数,注意强烈推荐用下面这个形式。传送string的时候,改为BSTR就可以。 dispparams.cNamedArgs = 0;EXCEPINFO excepInfo;memset(&excepInfo, 0, sizeof(excepInfo));CComVariant vaResult;UINT nArgErr = (UINT)-1; // initialize to invalid arg hr = pDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);if (SUCCEEDED(hr)){return TRUE;}}}}return FALSE;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值