[펌] ActiveX에서 javascript 함수 호출방법
void CallScript()
{
HRESULT hr;
IWebBrowser2 * pparent=NULL;
pparent = (IWebBrowser2*) GetIWebPointer();
LPDISPATCH lpDispatch = NULL;
hr = pparent->get_Document(&lpDispatch);
if (!SUCCEEDED(hr))
{
AfxMessageBox("error get document");
lpDispatch->Release();
return;
}
IHTMLDocument2 *m_pDoc2;
hr = lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**) &m_pDoc2);
if (!SUCCEEDED(hr))
{
AfxMessageBox("error get document interface");
m_pDoc2->Release();
return;
}
CComQIPtr< IHTMLDocument > pDoc( m_pDoc2 );
//
// 스크립트 엔진의 디스패치 를 얻는다.
//
CComPtr< IDispatch > pDisp;
hr = pDoc->get_Script( &pDisp );
//
// 스크립트 엔진디스패치에서 주어진 함수를 찾는다. 즉 dispid를 세트.
//
OLECHAR FAR* szFunctionName = L"EndUpload"; // 호출할 Javascript 명
DISPID dispid;
hr = pDisp->GetIDsOfNames( IID_NULL, &szFunctionName, 1,
LOCALE_SYSTEM_DEFAULT, &dispid);
//
// Invoke하기 위한 파라미터 세트.
//
DISPPARAMS dispParams;
dispParams.rgvarg = NULL;
dispParams.rgdispidNamedArgs = NULL;
dispParams.cArgs = 0;
dispParams.cNamedArgs = 0;
hr = pDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT,
DISPATCH_METHOD, &dispParams, NULL, NULL, NULL);
}
방법 2
void CallScript()
{
LPOLECLIENTSITE pIClientSite;
IDispatch* pIHTMLDocument = NULL;
IHTMLDocument2* pDoc = NULL;
IServiceProvider* pISP = NULL;
CComPtr< IDispatch > pDisp;
try
{
pIClientSite = GetClientSite();
hr = pIClientSite->QueryInterface(IID_IServiceProvider, (void**)&pISP);
if (hr != S_OK) throw 0;
hr = pISP->QueryService(SID_SContainerDispatch, IID_IDispatch, (void **)&pIHTMLDocument);
if (hr != S_OK) throw 0;
hr = pIHTMLDocument->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
if (hr != S_OK) throw 0;
hr = pDoc->get_Script( &pDisp );
if (hr != S_OK) throw 0;
OLECHAR FAR* szFunctionName = L"EndUpload"; // 호출할 Javascript 명
DISPID dispid;
hr = pDisp->GetIDsOfNames( IID_NULL, &szFunctionName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if (hr != S_OK) throw 0;
DISPPARAMS dispParams;
dispParams.rgvarg = NULL;
dispParams.rgdispidNamedArgs = NULL;
dispParams.cArgs = 0;
dispParams.cNamedArgs = 0;
hr = pDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispParams, NULL, NULL, NULL);
if (hr != S_OK) throw 0;
}
catch (...)
{
}
if(pDoc) pDoc->Release();
if(pIHTMLDocument) pIHTMLDocument->Release();
if(pISP) pISP->Release();
if(pDisp) pDisp->Release();
// if(pIClientSite) pIClientSite->Release();
}
'IT-개발,DB' 카테고리의 다른 글
[개발/VC] IE 서브클래싱(subclass) (0) | 2011.02.07 |
---|---|
[개발/VC++] 인터넷 익스플로러 윈도우 핸들 구하기 (0) | 2011.02.01 |
[개발] VC++, C#, 웹페이지의 존재여부를 확인하기 위한 팁입니다. (0) | 2011.01.19 |
[VC++] SubClassing 하는 방법 (0) | 2011.01.18 |
[VC++] IWebBrowser 스크롤 막대 및 테두리 제거 (0) | 2011.01.13 |
댓글