본문 바로가기

Window Programming/VC

MS Script Control in MFC

 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로 한다음 하면 된다.