JS 호출 BHO
                                            
 5084 단어  js
                    
// BHO         ,  UIHandler
// BHO         :// CDocDispatch m_docDispatch;// CComPtr
// CComPtr
HRESULT CBHO::SetDocHostUIHandler(IDispatch *pWebBrowser)
{
	HRESULT hr = S_OK;
	if(NULL == pWebBrowser){
		hr = S_FALSE;
	}
	else{
		CComQIPtr<IWebBrowser2> spTempWebBrowser = pWebBrowser;
		// only deal with the main window
		if (spTempWebBrowser && m_spWebBrowser && m_spWebBrowser.IsEqualObject(spTempWebBrowser))
		{
			CComPtr<IDispatch> spDispDoc = NULL;
			hr = spTempWebBrowser->get_Document(&spDispDoc);
			if (SUCCEEDED(hr) && NULL != spDispDoc)
			{
				CComQIPtr<IHTMLDocument2> spDoc2 = spDispDoc;
				if (spDoc2)
				{
					// Request default handler from MSHTML client site
					CComQIPtr<IOleObject> spOleObject = spDispDoc;
					if (spOleObject)
					{
						CComPtr<IOleClientSite> spClientSite = NULL;
						hr = spOleObject->GetClientSite(&spClientSite);
						if (SUCCEEDED(hr) && spClientSite)
						{
							m_spDefaultDocHostUIHandler = spClientSite;
							m_spDefaultOleCommandTarget = spClientSite;
						}
					}
					// Set the new custom IDocHostUIHandler
					CComQIPtr<ICustomDoc> spCustomDoc = spDoc2;
					if (spCustomDoc)
					{
						hr = spCustomDoc->SetUIHandler(this);
					}
				}
			}			
		}
	}
	return hr;
}
CBHO:: Invoke 에서 위의 함 수 를 호출 합 니 다.
... ...
switch (dispidMember)
    {
case DISPID_NAVIGATECOMPLETE2:
        {
			IDispatch* pDisp = pDispParams->rgvarg[1].pdispVal;
			SetDocHostUIHandler(pDisp);
        }
    break;
    }
... ... 
CBHO 구현 IDIDocHostUIHandler:: GetExternal 인터페이스
HRESULT STDMETHODCALLTYPE CBHO::GetExternal(IDispatch __RPC_FAR *__RPC_FAR *ppDispatch) 
{ 
    *ppDispatch = (IDispatch*)(&m_docDispatch);
    return S_OK; 
}CBHO:: SetSite 에 m 설정docDispatch
STDMETHODIMP CBHO::SetSite(IUnknown* pUnkSite)
{   
    if (pUnkSite != NULL)
    {
        pUnkSite->QueryInterface(IID_IWebBrowser2, (void**)&m_spWebBrowser);
        if (m_spWebBrowser)
        {
            m_docDispatch.SetSite(this);
            ... ...
        }
    }
    else
    {
        m_docDispatch.SetSite(NULL);
        ... ...
    }
    ... ...   
    return IObjectWithSiteImpl<CBHOMain>::SetSite(pUnkSite);
}
CDocDispatch 구현:: GetIDsOfnames
HRESULT STDMETHODCALLTYPE CDocDispatch::GetIDsOfNames( 
            REFIID riid,
            LPOLESTR __RPC_FAR *rgszNames,
            UINT cNames,
            LCID lcid,
            DISPID __RPC_FAR *rgDispId)
{
    UNREFERENCED_PARAMETER(riid);
    UNREFERENCED_PARAMETER(lcid);
	HRESULT hr = S_OK;
	for (UINT i=0; i < cNames; i++) 
	{
		CComBSTR bsName = rgszNames[i];
		if (0 == _tcsicmp(bsName, _T("Func1")))
		{
			rgDispId[i] = ID_OF_FUNC1;
		}
		else if(0 == _tcsicmp(bsName, _T("Func2")))
		{
			rgDispId[i] = ID_OF_FUNC2;
		}
		else 
		{
			// One or more are unknown so set the return code accordingly
			hr = ResultFromScode(DISP_E_UNKNOWNNAME);
			rgDispId[i] = DISPID_UNKNOWN;
			hr = E_NOTIMPL;
		}
	}
	... ...
	return hr;
}
CDocDispatch 구현:: Invoke
HRESULT STDMETHODCALLTYPE CDocDispatch::Invoke( 
            DISPID dispIdMember,
            REFIID riid,
            LCID lcid,
            WORD wFlags,
            DISPPARAMS __RPC_FAR *pDispParams,
            VARIANT __RPC_FAR *pvarResult,
            EXCEPINFO __RPC_FAR *pexcepinfo,
            UINT __RPC_FAR *puArgErr)
{
	HRESULT hr = S_OK;
	switch(dispIdMember)
	{
	case ID_OF_FUNC1:
                if(m_pSite)
		{
                        //       js  ,        
			m_pSite->CallToJsFunction(pDispParams->rgvarg[1].bstrVal, pDispParams->rgvarg[0].bstrVal);
		}
		break;
	case ID_OF_FUNC2:
		if(m_pSite)
		{
                        //      
			long result = ...
			CComVariant varResult(result );
			hr = varResult.Detach(pvarResult);
		}
		break;
	default:
		break;
	}
	 ... ...
	return hr;
}    
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[2022.04.19] 자바스크립트 this - 생성자 함수와 이벤트리스너에서의 this18일에 this에 대해 공부하면서 적었던 일반적인 함수나 객체에서의 this가 아닌 오늘은 이벤트리스너와 생성자 함수 안에서의 this를 살펴보기로 했다. new 키워드를 붙여 함수를 생성자로 사용할 때 this는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.