오후 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>

'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

+ Recent posts