SCRIPT.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:13k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // Script.Cpp : implementation file
  2. //
  3. #include "StdAfx.H"
  4. #include "TestCon.H"
  5. #ifdef _DEBUG
  6. #define new DEBUG_NEW
  7. #undef THIS_FILE
  8. static char THIS_FILE[] = __FILE__;
  9. #endif
  10. /////////////////////////////////////////////////////////////////////////////
  11. // CScript
  12. IMPLEMENT_DYNAMIC( CScript, CCmdTarget )
  13. CScript::CScript( CScriptManager* pManager ) :
  14.    m_pManager( pManager )
  15. {
  16.    ASSERT( m_pManager != NULL );
  17. }
  18. CScript::~CScript()
  19. {
  20.    Unload();
  21. }
  22. HRESULT CScript::AddNamedItem( LPCTSTR pszItemName )
  23. {
  24.    USES_CONVERSION;
  25.    LPCOLESTR pszItemNameO;
  26.    HRESULT hResult;
  27.    pszItemNameO = T2COLE( pszItemName );
  28.    hResult = m_pActiveScript->AddNamedItem( pszItemNameO,
  29.   SCRIPTITEM_ISSOURCE|SCRIPTITEM_ISVISIBLE );
  30.    if( FAILED( hResult ) )
  31.    {
  32.   return( hResult );
  33.    }
  34.    return( S_OK );
  35. }
  36. BOOL CScript::FindMacro( LPCTSTR pszMacroName )
  37. {
  38.    DISPID dispid;
  39.    ASSERT( pszMacroName != NULL );
  40.    return( m_mapMacros.Lookup( pszMacroName, dispid ) );
  41. }
  42. POSITION CScript::GetFirstMacroPosition()
  43. {
  44.    return( m_mapMacros.GetStartPosition() );
  45. }
  46. CString CScript::GetName()
  47. {
  48.    return( m_strScriptName );
  49. }
  50. CString CScript::GetNextMacroName( POSITION& posMacro )
  51. {
  52.    CString strMacro;
  53.    DISPID dispid;
  54.    m_mapMacros.GetNextAssoc( posMacro, strMacro, dispid );
  55.    return( strMacro );
  56. }
  57. HRESULT CScript::LoadScript( LPCTSTR pszFileName, LPCTSTR pszScriptName )
  58. {
  59.    ITypeInfoPtr pTypeInfo;
  60.    HRESULT hResult;
  61.    CLSID clsid;
  62.    CFile file;
  63.    ULONG nFileSize;
  64.    BSTR bstrScript;
  65.    BOOL tSuccess;
  66.    int iMethod;
  67.    UINT nNames;
  68.    BSTR bstrName;
  69.    CString strName;
  70.    CString strExtension;
  71.    int iChar;
  72.    ASSERT( pszFileName != NULL );
  73.    ASSERT( pszScriptName != NULL );
  74.    ASSERT( m_pActiveScript == NULL );
  75.    iChar = lstrlen( pszFileName )-1;
  76.    while( (iChar >= 0) && (pszFileName[iChar] != _T( '.' )) )
  77.    {
  78.   iChar--;
  79.    }
  80.    if( (iChar >= 0) && (lstrcmpi( &pszFileName[iChar], _T( ".js" ) ) == 0) )
  81.    {
  82.   hResult = CLSIDFromProgID( L"JScript", &clsid );
  83.   if( FAILED( hResult ) )
  84.   {
  85.  return( hResult );
  86.   }
  87.    }
  88.    else
  89.    {
  90.   hResult = CLSIDFromProgID( L"VBScript", &clsid );
  91.   if( FAILED( hResult ) )
  92.   {
  93.  return( hResult );
  94.   }
  95.    }
  96.    hResult = m_pActiveScript.CreateInstance( clsid, NULL,
  97.   CLSCTX_INPROC_SERVER );
  98.    if( FAILED( hResult ) )
  99.    {
  100.   return( hResult );
  101.    }
  102.    m_pActiveScriptParse = m_pActiveScript;
  103.    if( m_pActiveScriptParse == NULL )
  104.    {
  105.   return( E_NOINTERFACE );
  106.    }
  107.    hResult = m_pActiveScript->SetScriptSite( &m_xActiveScriptSite );
  108.    if( FAILED( hResult ) )
  109.    {
  110.   return( hResult );
  111.    }
  112.    hResult = m_pActiveScriptParse->InitNew();
  113.    if( FAILED( hResult ) )
  114.    {
  115.   return( hResult );
  116.    }
  117.    CFileException error;
  118.    tSuccess = file.Open( pszFileName, CFile::modeRead|CFile::shareDenyWrite,
  119.   &error );
  120.    if( !tSuccess )
  121.    {
  122.   return( HRESULT_FROM_WIN32( error.m_lOsError ) );
  123.    }
  124.    nFileSize = file.GetLength();
  125.    nFileSize = file.Read( m_strScriptText.GetBuffer( nFileSize ), nFileSize );
  126.    file.Close();
  127.    m_strScriptText.ReleaseBuffer( nFileSize );
  128.    bstrScript = m_strScriptText.AllocSysString();
  129.    hResult = m_pActiveScriptParse->ParseScriptText( bstrScript, NULL, NULL,
  130.   NULL, DWORD( this ), 0, SCRIPTTEXT_ISVISIBLE, NULL, NULL );
  131.    SysFreeString( bstrScript );
  132.    if( FAILED( hResult ) )
  133.    {
  134.   return( hResult );
  135.    }
  136.    hResult = m_pManager->AddNamedItems( m_pActiveScript );
  137.    if( FAILED( hResult ) )
  138.    {
  139.   return( hResult );
  140.    }
  141.    hResult = m_pActiveScript->SetScriptState( SCRIPTSTATE_CONNECTED );
  142.    if( FAILED( hResult ) )
  143.    {
  144.   return( hResult );
  145.    }
  146.    hResult = m_pActiveScript->GetScriptDispatch( NULL, &m_pDispatch );
  147.    if( FAILED( hResult ) )
  148.    {
  149.   return( hResult );
  150.    }
  151.    hResult = m_pDispatch->GetTypeInfo( 0, GetUserDefaultLCID(), &pTypeInfo );
  152.    if( FAILED( hResult ) )
  153.    {
  154.   return( hResult );
  155.    }
  156.    CSmartTypeAttr pTypeAttr( pTypeInfo );
  157.    CSmartFuncDesc pFuncDesc( pTypeInfo );
  158.    hResult = pTypeInfo->GetTypeAttr( &pTypeAttr );
  159.    if( FAILED( hResult ) )
  160.    {
  161.   return( hResult );
  162.    }
  163.    for( iMethod = 0; iMethod < pTypeAttr->cFuncs; iMethod++ )
  164.    {
  165.   hResult = pTypeInfo->GetFuncDesc( iMethod, &pFuncDesc );
  166.   if( FAILED( hResult ) )
  167.   {
  168.  return( hResult );
  169.   }
  170.   if( (pFuncDesc->funckind == FUNC_DISPATCH) && (pFuncDesc->invkind ==
  171.  INVOKE_FUNC) && (pFuncDesc->cParams == 0) )
  172.   {
  173.  bstrName = NULL;
  174.  hResult = pTypeInfo->GetNames( pFuncDesc->memid, &bstrName, 1,
  175. &nNames );
  176.  if( FAILED( hResult ) )
  177.  {
  178. return( hResult );
  179.  }
  180.  ASSERT( nNames == 1 );
  181.  strName = bstrName;
  182.  SysFreeString( bstrName );
  183.  bstrName = NULL;
  184.  // Macros can't contain underscores, since those denote event handlers
  185.  if( strName.Find( _T( '_' ) ) == -1 )
  186.  {
  187. m_mapMacros.SetAt( strName, pFuncDesc->memid );
  188.  }
  189.   }
  190.   pFuncDesc.Release();
  191.    }
  192.    m_strScriptName = pszScriptName;
  193.    return( S_OK );
  194. }
  195. HRESULT CScript::RunMacro( LPCTSTR pszMacroName )
  196. {
  197.    DISPID dispid;
  198.    COleDispatchDriver driver;
  199.    BOOL tFound;
  200.    ASSERT( pszMacroName != NULL );
  201.    tFound = m_mapMacros.Lookup( pszMacroName, dispid );
  202.    if( !tFound )
  203.    {
  204.   return( DISP_E_MEMBERNOTFOUND );
  205.    }
  206.    driver.AttachDispatch( m_pDispatch, FALSE );
  207.    try
  208.    {
  209.   driver.InvokeHelper( dispid, DISPATCH_METHOD, VT_EMPTY, NULL, VTS_NONE );
  210.    }
  211.    catch( COleDispatchException* pException )
  212.    {
  213.   CString strMessage;
  214.   AfxFormatString1( strMessage, IDS_DISPATCHEXCEPTION,
  215.  pException->m_strDescription );
  216.   AfxMessageBox( strMessage );
  217.   pException->Delete();
  218.    }
  219.    catch( COleException* pException )
  220.    {
  221.   pException->Delete();
  222.    }
  223.    return( S_OK );
  224. }
  225. void CScript::Unload()
  226. {
  227.    if( m_pDispatch != NULL )
  228.    {
  229.   m_pDispatch.Release();
  230.    }
  231.    if( m_pActiveScript != NULL )
  232.    {
  233.   m_pActiveScript->SetScriptState( SCRIPTSTATE_DISCONNECTED );
  234.   m_pActiveScript->Close();
  235.   m_pActiveScript.Release();
  236.    }
  237.    if( m_pActiveScriptParse != NULL )
  238.    {
  239.   m_pActiveScriptParse.Release();
  240.    }
  241. }
  242. BEGIN_INTERFACE_MAP( CScript, CCmdTarget )
  243.    INTERFACE_PART( CScript, IID_IActiveScriptSite, ActiveScriptSite )
  244.    INTERFACE_PART( CScript, IID_IActiveScriptSiteWindow, ActiveScriptSiteWindow )
  245. END_INTERFACE_MAP()
  246. BEGIN_MESSAGE_MAP(CScript, CCmdTarget)
  247. //{{AFX_MSG_MAP(CScript)
  248. // NOTE - the ClassWizard will add and remove mapping macros here.
  249. //}}AFX_MSG_MAP
  250. END_MESSAGE_MAP()
  251. /////////////////////////////////////////////////////////////////////////////
  252. // CScript message handlers
  253. ///////////////////////////////////////////////////////////////////////////////
  254. // IActiveScriptSite
  255. ///////////////////////////////////////////////////////////////////////////////
  256. STDMETHODIMP_( ULONG ) CScript::XActiveScriptSite::AddRef()
  257. {
  258.    METHOD_PROLOGUE_( CScript, ActiveScriptSite )
  259.    TRACE( "XActiveScriptSite::AddRef()n" );
  260.    return( pThis->ExternalAddRef() );
  261. }
  262. STDMETHODIMP_( ULONG ) CScript::XActiveScriptSite::Release()
  263. {
  264.    METHOD_PROLOGUE_( CScript, ActiveScriptSite )
  265.    TRACE( "XActiveScriptSite::Release()n" );
  266.    return( pThis->ExternalRelease() );
  267. }
  268. STDMETHODIMP CScript::XActiveScriptSite::QueryInterface( REFIID iid,
  269.    void** ppInterface )
  270. {
  271.    METHOD_PROLOGUE_( CScript, ActiveScriptSite )
  272.    return( pThis->ExternalQueryInterface( &iid, ppInterface ) );
  273. }
  274. STDMETHODIMP CScript::XActiveScriptSite::GetDocVersionString(
  275.    BSTR* pbstrVersion )
  276. {
  277.    (void)pbstrVersion;
  278.    METHOD_PROLOGUE( CScript, ActiveScriptSite )
  279.    return( E_NOTIMPL );
  280. }
  281. STDMETHODIMP CScript::XActiveScriptSite::GetItemInfo( LPCOLESTR pszName,
  282.    DWORD dwReturnMask, IUnknown** ppItem, ITypeInfo** ppTypeInfo )
  283. {
  284.    USES_CONVERSION;
  285.    LPCTSTR pszNameT;
  286.    HRESULT hResult;
  287.    METHOD_PROLOGUE( CScript, ActiveScriptSite )
  288.    if( ppItem != NULL )
  289.    {
  290.   *ppItem = NULL;
  291.    }
  292.    if( ppTypeInfo != NULL )
  293.    {
  294.   *ppTypeInfo = NULL;
  295.    }
  296.    if( dwReturnMask&SCRIPTINFO_IUNKNOWN )
  297.    {
  298.   if( ppItem == NULL )
  299.   {
  300.  return( E_POINTER );
  301.   }
  302.    }
  303.    if( dwReturnMask&SCRIPTINFO_ITYPEINFO )
  304.    {
  305.   if( ppTypeInfo == NULL )
  306.   {
  307.  return( E_POINTER );
  308.   }
  309.    }
  310.    pszNameT = OLE2CT( pszName );
  311.    TRACE( "XActiveScriptSite::GetItemInfo( %s )n", pszNameT );
  312.    if( dwReturnMask&SCRIPTINFO_IUNKNOWN )
  313.    {
  314.   hResult = pThis->m_pManager->GetItemDispatch( pszNameT, ppItem );
  315.   if( FAILED( hResult ) )
  316.   {
  317.  return( hResult );
  318.   }
  319.    }
  320.    if( dwReturnMask&SCRIPTINFO_ITYPEINFO )
  321.    {
  322.   pThis->m_pManager->GetItemTypeInfo( pszNameT, ppTypeInfo );
  323.    }
  324.    return( S_OK );
  325. }
  326. STDMETHODIMP CScript::XActiveScriptSite::GetLCID( LCID* plcid )
  327. {
  328.    METHOD_PROLOGUE( CScript, ActiveScriptSite )
  329.    if( plcid == NULL )
  330.    {
  331.   return( E_POINTER );
  332.    }
  333.    *plcid = GetUserDefaultLCID();
  334.    return( S_OK );
  335. }
  336. STDMETHODIMP CScript::XActiveScriptSite::OnEnterScript()
  337. {
  338.    METHOD_PROLOGUE( CScript, ActiveScriptSite )
  339.    return( S_OK );
  340. }
  341. STDMETHODIMP CScript::XActiveScriptSite::OnLeaveScript()
  342. {
  343.    METHOD_PROLOGUE( CScript, ActiveScriptSite )
  344.    return( S_OK );
  345. }
  346. STDMETHODIMP CScript::XActiveScriptSite::OnScriptError(
  347.    IActiveScriptError* pError )
  348. {
  349.    USES_CONVERSION;
  350.    HRESULT hResult;
  351.    CExcepInfo excep;
  352.    CString strMessage;
  353.    int nResult;
  354.    DWORD dwContext;
  355.    ULONG iLine;
  356.    LONG iChar;
  357.    BSTR bstrSourceLineText;
  358.    METHOD_PROLOGUE( CScript, ActiveScriptSite )
  359.    TRACE( "XActiveScriptSite::OnScriptError()n" );
  360.    ASSERT( pError != NULL );
  361.    hResult = pError->GetSourcePosition( &dwContext, &iLine, &iChar );
  362.    if( SUCCEEDED( hResult ) )
  363.    {
  364.   TRACE( "Error at line %u, character %dn", iLine, iChar );
  365.    }
  366.    bstrSourceLineText = NULL;
  367.    hResult = pError->GetSourceLineText( &bstrSourceLineText );
  368.    if( SUCCEEDED( hResult ) )
  369.    {
  370.   TRACE( "Source Text: %sn", OLE2CT( bstrSourceLineText ) );
  371.   SysFreeString( bstrSourceLineText );
  372.   bstrSourceLineText = NULL;
  373.    }
  374.    hResult = pError->GetExceptionInfo( &excep );
  375.    if( SUCCEEDED( hResult ) )
  376.    {
  377.   AfxFormatString2( strMessage, IDS_SCRIPTERRORFORMAT, OLE2CT(
  378.  excep.bstrSource ), OLE2CT( excep.bstrDescription ) );
  379.   nResult = AfxMessageBox( strMessage, MB_YESNO );
  380.   if( nResult == IDYES )
  381.   {
  382.  return( S_OK );
  383.   }
  384.   else
  385.   {
  386.  return( E_FAIL );
  387.   }
  388.    }
  389.    return( E_FAIL );
  390. }
  391. STDMETHODIMP CScript::XActiveScriptSite::OnScriptTerminate(
  392.    const VARIANT* pvarResult, const EXCEPINFO* pExcepInfo )
  393. {
  394.    (void)pvarResult;
  395.    (void)pExcepInfo;
  396.    METHOD_PROLOGUE( CScript, ActiveScriptSite )
  397.    TRACE( "XActiveScriptSite::OnScriptTerminate()n" );
  398.    return( S_OK );
  399. }
  400. STDMETHODIMP CScript::XActiveScriptSite::OnStateChange(
  401.    SCRIPTSTATE eState )
  402. {
  403.    METHOD_PROLOGUE( CScript, ActiveScriptSite )
  404.    TRACE( "XActiveScriptSite::OnStateChange()n" );
  405.    switch( eState )
  406.    {
  407.    case SCRIPTSTATE_UNINITIALIZED:
  408.   TRACE( "tSCRIPTSTATE_UNINITIALIZEDn" );
  409.   break;
  410.    case SCRIPTSTATE_INITIALIZED:
  411.   TRACE( "tSCRIPTSTATE_INITIALIZEDn" );
  412.   break;
  413.    case SCRIPTSTATE_STARTED:
  414.   TRACE( "tSCRIPTSTATE_STARTEDn" );
  415.   break;
  416.    case SCRIPTSTATE_CONNECTED:
  417.   TRACE( "tSCRIPTSTATE_CONNECTEDn" );
  418.   break;
  419.    case SCRIPTSTATE_DISCONNECTED:
  420.   TRACE( "tSCRIPTSTATE_DISCONNECTEDn" );
  421.   break;
  422.    case SCRIPTSTATE_CLOSED:
  423.   TRACE( "tSCRIPTSTATE_CLOSEDn" );
  424.   break;
  425.    default:
  426.   TRACE( "tUnknown SCRIPTSTATE valuen" );
  427.   ASSERT( FALSE );
  428.   break;
  429.    }
  430.    return( S_OK );
  431. }
  432. ///////////////////////////////////////////////////////////////////////////////
  433. // IActiveScriptSiteWindow
  434. ///////////////////////////////////////////////////////////////////////////////
  435. STDMETHODIMP_( ULONG ) CScript::XActiveScriptSiteWindow::AddRef()
  436. {
  437.    METHOD_PROLOGUE_( CScript, ActiveScriptSiteWindow )
  438.    TRACE( "XActiveScriptSiteWindow::AddRef()n" );
  439.    return( pThis->ExternalAddRef() );
  440. }
  441. STDMETHODIMP_( ULONG ) CScript::XActiveScriptSiteWindow::Release()
  442. {
  443.    METHOD_PROLOGUE_( CScript, ActiveScriptSiteWindow )
  444.    TRACE( "XActiveScriptSiteWindow::Release()n" );
  445.    return( pThis->ExternalRelease() );
  446. }
  447. STDMETHODIMP CScript::XActiveScriptSiteWindow::QueryInterface(
  448.    REFIID iid, void** ppInterface )
  449. {
  450.    METHOD_PROLOGUE_( CScript, ActiveScriptSiteWindow )
  451.    return( pThis->ExternalQueryInterface( &iid, ppInterface ) );
  452. }
  453. STDMETHODIMP CScript::XActiveScriptSiteWindow::EnableModeless(
  454.    BOOL tEnable )
  455. {
  456.    (void)tEnable;
  457.    METHOD_PROLOGUE( CScript, ActiveScriptSiteWindow )
  458.    return( E_NOTIMPL );
  459. }
  460. STDMETHODIMP CScript::XActiveScriptSiteWindow::GetWindow(
  461.    HWND* phWindow )
  462. {
  463.    METHOD_PROLOGUE( CScript, ActiveScriptSiteWindow )
  464.    if( phWindow == NULL )
  465.    {
  466.   return( E_POINTER );
  467.    }
  468.    *phWindow = AfxGetMainWnd()->GetSafeHwnd();
  469.    return( S_OK );
  470. }