MS Script Control in MFC
오전 1:28 2000/10/04 조경민 bro@shinbiro.com

=-===========================
MSVB Script Constrol 객체를 만들기

  먼저 프로젝트에서 Project/Add Project/Controls and Component에서
  Registered ActiveX Controls 부분에서 Script Control을 얻어온다.

1. ActiveX 폼 붙이기 식
  다이얼로그 폼에다가 MSScript를 하나 붙인다. 그리고 Property에서
Language 를 VBScript로 준다.
그후 클래스 위자드에서 MSScript를 이용해 m_scptBro라는 맴버자료를
만든후 버튼을 누르면 다음 코드를 실행하게 한다.
#include <comdef.h>
#include <afxpriv.h>
#include "ScriptError.h"
를 한후
        m_scptBro.AddCode( "                            \r\n\
                Function fnMethod ( i )                        \r\n\
                a = cstr(i+1)                                \r\n\
                a = a + \"날짜도\"+ cstr(date)                \r\n\
                        fnMethod = a                        \r\n\
                End Function                            \
                " );
        _variant_t vsRet = m_scptBro.Eval("fnMethod(100)");
        _bstr_t bsRet(vsRet);
        
        
        //char* pszRet = bsRet.Copy();
        MessageBox( (LPCTSTR)bsRet );

2. 코드로 스크립트 객체 생성

        CScriptControl        sc;
        
        if( sc.Create("aa", WS_CHILD, CRect(0,0,0,0), this, 6501 ) )
        {
                sc.SetLanguage(NULL);
                sc.SetLanguage("VBScript");
                MessageBox( sc.GetLanguage() );
                
                sc.AddCode( "                              \r\n\
                        Functio 먼저 프로젝트에서 n fnMethod ( i )                                                        \r\n\
                        a = cstr(i+1)                                                                \r\n\
                        a = a + \"날짜도\"+ cstr(date)                                                                \r\n\
                                fnMethod = a                                      \r\n\
                        End Function                                  \
                        " );

                //_variant_t vsRet = m_scptBro.Eval("(\"xx\" =  \"yy\")");
                _variant_t vsRet = sc.Eval("fnMethod(100)");
                _bstr_t bsRet(vsRet);
                
                
                //char* pszRet = bsRet.Copy();
                MessageBox( (LPCTSTR)bsRet );
        }`

3. ocx 수준 COM 모듈로 불러 쓰기
// 다음은 MSVBScript Control 엑티브 엑스를 추가하지 않고 하는 방법이다.
// ocx위치를 탐색기로 찾아내서 import 패스를 넣으면 된다.

#import "C:\Program Files\Microsoft Script Control\msscript.ocx"
또는
#import "C:\\winnt\\system32\\msscript.ocx"
using namespace MSScriptControl;
한후
IScriptControlPtr spScriptCtl(__uuidof(ScriptControl));
하면 된다. 즉 아래처럼


   try  // Make sure exception handling is turned on.
   {
      _bstr_t bstrLanguage(L"VBScript");
      _bstr_t bstrCode(L"MsgBox \"Hello World\"");

      // Create the Script Control, initialize Language, and
      // add code for processing.
      IScriptControlPtr spScriptCtl(__uuidof(ScriptControl));
      spScriptCtl->put_Language(bstrLanguage);
      spScriptCtl->AddCode(bstrCode);
   }
   catch(_com_error e)
   {
      TRACE(_T("Error (%08x) in %s: %s\n"), e.Error(),
                           e.Source(), e.Description());
   }


   Run으로 실행한후 결과 받기
=============================================================
        IScriptControlPtr m_pScript; 라면 ...
        m_pScript.CreateInstance(__uuidof(ScriptControl));
        m_pScript.AddCode(코드);
        
                  :    
        SAFEARRAY* sa;    // 메소드의 인자가 들어갈 배열
        long ix[1];       // 1차원 배열
        _bstr_t bsParam(pszPram);
        _variant_t vsParam(bsParam);  // _variant_t에 넣음
        // 1칸짜리 배열을 만든다.
        sa = SafeArrayCreateVector(VT_VARIANT, 0, 1);
        ix[0] = 0;        // 첫째 인자
        // 배열에 값을 넣는다.
        SafeArrayPutElement(sa, ix, &vsMessage);

        _variant_t vsOut = m_pScript->Run(_bstr_t(L"Main"), &sa);
        TRACE("%s",(LPCTSTR)(_bstr_t)vsOut);

    코드는
    Function Main(sIn)
        sIn ="스크립트"+cstr(2+4)
    End Function

    그러면 스크립트6 라고 출력된다.

트러블 슈팅
------------------------------------------------------------------
1. MFC시 CScriptControl 객체를 만들어서 할경우 언어를 설정하지
않았다고 나는 경우
                sc.SetLanguage(NULL);
                sc.SetLanguage("VBScript");
이렇게 먼저 설정을 NULL로 한다음 하면 된다.

+ Recent posts