본문 바로가기

c++/MFC

JavaScript와 MFC간 통신

반응형

JS에서 MFC함수 호출

//MyHtmlClass.h
class CMyHtmlClass: public CDHtmlDialog
{
	DECLARE_DISPATCH_MAP()
	VOID	MfcFunc(LPCTSTR _strParam1, LPCTSTR _strParam2);
}

//MyHtmlClass.cpp
BEGIN_DISPATCH_MAP(CEzCallManagerMainDlg, CDHtmlDialog)
DISP_FUNCTION(CMyHtmlClass, "MfcFunc", MfcFunc, VT_EMPTY, VTS_BSTR VTS_BSTR)
END_DISPATCH_MAP()

BOOL CMyHtmlClass::OnInitDialog()
{
	CDHtmlDialog::OnInitDialog();

	EnableAutomation();
	SetExternalDispatch(GetIDispatch(TRUE));

	// TODO: 여기에 추가 초기화 작업을 추가합니다.

	return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}


VOID CMyHtmlClass::MfcFunc(LPCTSTR _strParam1, LPCTSTR _strParam2)
{
}


MFC에서 JS함수 호출

INT CMyHtmlClass::GetJsData()
{
	INT nRet = 0;
	IDispatch *spDocIDispatch = NULL;

	m_pBrowserApp->get_Document(&spDocIDispatch); 

	if (spDocIDispatch == NULL) 
	{
		nRet = -101;
		return nRet;
	}

	IHTMLDocument2* pDoc2 = NULL;
	spDocIDispatch->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc2);

	if( pDoc2 == NULL )
	{
		nRet = -102;
		return nRet;
	}

	CComQIPtr pDoc(pDoc2);
	CComPtr pDisp;
	HRESULT hr = pDoc->get_Script(&pDisp);

	if( SUCCEEDED(hr) )
	{
		CString strResult  = L"";
		OLECHAR FAR* szFunction = L"GetJsData";
		DISPID dispid;
		hr = pDisp->GetIDsOfNames(IID_NULL, &szFunction, 1, LOCALE_SYSTEM_DEFAULT, &dispid);

		if( SUCCEEDED(hr) )
		{
			COleVariant vtResult;
			//static BYTE parms[] = VTS_BSTR;
			COleDispatchDriver dispDriver(pDisp, FALSE);

			dispDriver.InvokeHelper
				(
				dispid, 
				DISPATCH_METHOD, 
				VT_VARIANT,
				(void*)&vtResult, 
				VTS_NONE //_T("hi")
				);
			strResult = vtResult.bstrVal;
		}
		else
		{
			nRet = -202;
		}
	}
	else
	{
		nRet = -201;
	}

	pDoc2->Release();

	return nRet;
}

반응형