|
// ScriptHost.h: Definition of the CScriptHost class
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SCRIPTHOST_H__47B7AE3B_5254_43ED_80FA_5DBE3E23141F__INCLUDED_)
#define AFX_SCRIPTHOST_H__47B7AE3B_5254_43ED_80FA_5DBE3E23141F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "resource.h" // main symbols
#include "ScriptRunner.h"
#include "ActiveScriptBase.h"
#include "ScriptHostCP.h"
#define SCRIPTHOST L"ScriptHost"
/////////////////////////////////////////////////////////////////////////////
// CScriptHost
class CScriptHost :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CScriptHost,&CLSID_ScriptHost>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CScriptHost>,
public IActiveScriptSiteImpl<CScriptHost>,
public IActiveScriptSiteWindowImpl<CScriptHost>,
public IActiveScriptSiteInterruptPollImpl<CScriptHost>,
public IProvideClassInfo2Impl<&CLSID_ScriptHost, &DIID__IScriptHostEvents, &LIBID_SCRIPTRUNNERLib>,
public IDispatchImpl<IScriptHost, &IID_IScriptHost, &LIBID_SCRIPTRUNNERLib>,
public CProxy_IScriptHostEvents< CScriptHost >
{
public:
CScriptHost()
{
m_hWndBase = GetDesktopWindow();
m_bRequestStop = false;
}
BEGIN_COM_MAP(CScriptHost)
COM_INTERFACE_ENTRY(IScriptHost)
COM_INTERFACE_ENTRY(IActiveScriptSite)
COM_INTERFACE_ENTRY(IActiveScriptSiteWindow)
COM_INTERFACE_ENTRY(IActiveScriptSiteInterruptPoll)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
DECLARE_NOT_AGGREGATABLE(CScriptHost)
BEGIN_CONNECTION_POINT_MAP(CScriptHost)
CONNECTION_POINT_ENTRY(DIID__IScriptHostEvents)
END_CONNECTION_POINT_MAP()
DECLARE_REGISTRY_RESOURCEID(IDR_SCRIPTHOST)
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
public:
HWND m_hWndBase;
CComPtr<IActiveScriptParse> m_pAxsParse; // Active Script parse object
CComPtr<IActiveScript> m_pAxsScript; // Active Script
bool m_bRequestStop; // Should Script stop?
LPDISPATCH CreateObjectHelper(LPCOLESTR bstrProgID);
void ReleaseObjects();
ISRWindowDisp* CreateWindowDisp(HWND hWnd);
LPUNKNOWN GetObjectPointer(const WCHAR* pstrName)
{
LPUNKNOWN lpUnknown = NULL;
if (wcscmp(SCRIPTHOST, pstrName) == 0)
{
lpUnknown = GetUnknown();
//QueryInterface(IID_IUnknown, (void**)&lpUnknown);
}
return lpUnknown;
}
HWND GetBaseWindow()
{
return m_hWndBase;
}
HRESULT InternalQueryContinue()
{
HRESULT hr = S_OK;
// Check for Ctrl+Break, stop script...
SHORT shCtrlBreak = GetAsyncKeyState( VK_CANCEL );
if (shCtrlBreak != 0 || m_bRequestStop)
{
MessageBeep(MB_OK);
m_bRequestStop = true;
hr = S_FALSE;
}
return hr;
}
STDMETHOD(OnScriptError)(IActiveScriptError* pse)
{
HRESULT hr = S_OK;
if ( !m_bRequestStop )
hr = IActiveScriptSiteImpl<CScriptHost>::OnScriptError( pse );
return hr;
}
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
ReleaseObjects();
}
// IScriptHost
public:
STDMETHOD(SetHostWindow)(/*[in]*/LONG lWindow);
STDMETHOD(CreateEngine)(/*[in]*/BSTR pstrProgID);
STDMETHOD(DestroyEngine)(void);
STDMETHOD(CreateObject)(/*[in]*/BSTR strProgID, /*[out,retval]*/LPDISPATCH* ppObject);
STDMETHOD(RunScript)(/*[in]*/BSTR pstrScriptCode);
STDMETHOD(StopScript)(void);
STDMETHOD(Display)(/*[in]*/BSTR strText);
STDMETHOD(DebugOutput)(/*[in]*/BSTR strText);
STDMETHOD(FindWindow)(/*[in]*/BSTR lpszClass, /*[in]*/BSTR lpszWindow, /*[out,retval]*/ISRWindowDisp** ppWindow);
STDMETHOD(SendKey)(/*[in]*/int vkCode, /*[in,optional]*/VARIANT* ctrl, /*[in,optional]*/VARIANT* alt);
STDMETHOD(SendKeys)(/*[in]*/BSTR bstrKeys);
STDMETHOD(Sleep)(/*[in]*/unsigned int uiDelay);
STDMETHOD(LaunchApp)(/*[in]*/BSTR bstrApplicationName, /*[out,retval]*/VARIANT_BOOL* pRetVal);
STDMETHOD(GetEnvString)(BSTR sName, /*[out,retval]*/ BSTR* pbstrOut);
};
#if _MSC_VER > 1200
OBJECT_ENTRY_AUTO(__uuidof(ScriptHost), CScriptHost)
#endif
#endif // !defined(AFX_SCRIPTHOST_H__47B7AE3B_5254_43ED_80FA_5DBE3E23141F__INCLUDED_)
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Ernest is a multi-discipline software engineer.
Skilled at software design and development for all Windows platforms.
-
MCSD (C#, .NET)
Interests: User Interface, GDI/GDI+, Scripting, Android, iOS, Windows Mobile.
Programming Skills: C/C++, C#, Java (Android), VB and ASP.NET.
I hope you will enjoy my contributions.