오후 11:42 2003-01-10
조경민 bro@shinbiro.com
HTML 스크립트 함수 ActiveX에서 호출하기
=================================================================
음.. 참고하세요. 관련 코드입니다.
그대로 따라하라기 보다는 보시면 아시겠지만, (흐름을 보시면 되요 )
IDocument 에서 get_script로 스크립트 객체를 얻은 후
GetIDsOfNames( 함수명 ) 으로 해당 함수를 얻은 후 Invoke 하는게
다 입니다. 간단하죠 ^^ ( 물론 처음에 이렇게 코드를 알려주신 분에겐 감사를 하면서
샤샥 카피 페이스트 해주세요 )
STDMETHODIMP CHtmlScriptUser::invokeScript()
{
static LPOLESTR strFxn = OLESTR("Calculate");
CComPtr<IOleClientSite>piSite;
if (FAILED(GetSite(IID_IOleClientSite, (void**)&piSite)) || !piSite)
return S_FALSE;
CComPtr<IOleContainer>piContainer;
if (FAILED(piSite->GetContainer(&piContainer)) || !piContainer)
return S_FALSE;
CComQIPtr<IHTMLDocument2>piDoc(piContainer);
if (!piDoc)
return S_FALSE;
CComPtr<IDispatch>pdispScript;
if (FAILED(piDoc->get_Script(&pdispScript)) && !pdispScript)
return S_FALSE;
DISPID dispID;
if (SUCCEEDED(pdispScript->GetIDsOfNames(
IID_NULL, &strFxn, 1, LOCALE_USER_DEFAULT, &dispID)))
{
CComVariant vArgs[] = {
(long)50, (long)30 };
DISPPARAMS params = {
vArgs, NULL, 2, 0 };
CComVariant vResult;
if (SUCCEEDED(pdispScript->Invoke(dispID, IID_NULL, 0,
DISPATCH_METHOD, ¶ms, &vResult, NULL, NULL)))
{
if ((vResult.vt != VT_EMPTY) && ((vResult.vt == VT_I4) ||
SUCCEEDED(vResult.ChangeType(VT_I4))))
{
TCHAR tsz[50];
MessageBox(
NULL,
_ltot(vResult.lVal, tsz, 10),
_T("ScriptUser"), MB_ICONINFORMATION|MB_OK);
return S_OK;
}
}
}
return S_FALSE;
}
And the HTML...
<HTML>
<HEAD>
<TITLE>Test Page</TITLE>
<SCRIPT>
function Calculate(arg1, arg2)
{
return(arg1*arg2);
}
</SCRIPT>
</HEAD>
<BODY onclick="scriptUser.invokeScript()">
<P>Click anywhere to test the method</P>
<OBJECT
ID="scriptUser"
CLASSID="CLSID:586AA510-5C2F-11D5-9D2F-444553540000">
</OBJECT>
</BODY>
</HTML>
조경민 bro@shinbiro.com
HTML 스크립트 함수 ActiveX에서 호출하기
=================================================================
음.. 참고하세요. 관련 코드입니다.
그대로 따라하라기 보다는 보시면 아시겠지만, (흐름을 보시면 되요 )
IDocument 에서 get_script로 스크립트 객체를 얻은 후
GetIDsOfNames( 함수명 ) 으로 해당 함수를 얻은 후 Invoke 하는게
다 입니다. 간단하죠 ^^ ( 물론 처음에 이렇게 코드를 알려주신 분에겐 감사를 하면서
샤샥 카피 페이스트 해주세요 )
STDMETHODIMP CHtmlScriptUser::invokeScript()
{
static LPOLESTR strFxn = OLESTR("Calculate");
CComPtr<IOleClientSite>piSite;
if (FAILED(GetSite(IID_IOleClientSite, (void**)&piSite)) || !piSite)
return S_FALSE;
CComPtr<IOleContainer>piContainer;
if (FAILED(piSite->GetContainer(&piContainer)) || !piContainer)
return S_FALSE;
CComQIPtr<IHTMLDocument2>piDoc(piContainer);
if (!piDoc)
return S_FALSE;
CComPtr<IDispatch>pdispScript;
if (FAILED(piDoc->get_Script(&pdispScript)) && !pdispScript)
return S_FALSE;
DISPID dispID;
if (SUCCEEDED(pdispScript->GetIDsOfNames(
IID_NULL, &strFxn, 1, LOCALE_USER_DEFAULT, &dispID)))
{
CComVariant vArgs[] = {
(long)50, (long)30 };
DISPPARAMS params = {
vArgs, NULL, 2, 0 };
CComVariant vResult;
if (SUCCEEDED(pdispScript->Invoke(dispID, IID_NULL, 0,
DISPATCH_METHOD, ¶ms, &vResult, NULL, NULL)))
{
if ((vResult.vt != VT_EMPTY) && ((vResult.vt == VT_I4) ||
SUCCEEDED(vResult.ChangeType(VT_I4))))
{
TCHAR tsz[50];
MessageBox(
NULL,
_ltot(vResult.lVal, tsz, 10),
_T("ScriptUser"), MB_ICONINFORMATION|MB_OK);
return S_OK;
}
}
}
return S_FALSE;
}
And the HTML...
<HTML>
<HEAD>
<TITLE>Test Page</TITLE>
<SCRIPT>
function Calculate(arg1, arg2)
{
return(arg1*arg2);
}
</SCRIPT>
</HEAD>
<BODY onclick="scriptUser.invokeScript()">
<P>Click anywhere to test the method</P>
<OBJECT
ID="scriptUser"
CLASSID="CLSID:586AA510-5C2F-11D5-9D2F-444553540000">
</OBJECT>
</BODY>
</HTML>
'KB > MFC/Win32' 카테고리의 다른 글
MSN 코드 모음 (0) | 2004.03.19 |
---|---|
mshtml 메모리 릭 최소화하기 (0) | 2004.03.19 |
HTML 소스 얻기 (0) | 2004.03.19 |
MFC DLL Debug/Release 구분해서 하기 (0) | 2004.03.19 |
DLL, LIB 잘 배포하기 (0) | 2004.03.19 |