#pragma once
#include <objbase.h>
class CScriptHost : public IActiveScriptSite,
public IActiveScriptSiteWindow
{
public:
CScriptHost(LPUNKNOWN lpUnkCtrl, LPCOLESTR pNamedItem, HWND hWnd);
virtual ~CScriptHost();
HRESULT CreateScriptEngine();
HRESULT ParseFile(const char* pszFileName,LPCOLESTR pstrItemName);
public:
STDMETHOD(QueryInterface)(REFIID riid,void** ppvObj);
STDMETHOD_(unsigned long,AddRef)(void);
STDMETHOD_(unsigned long,Release)();
STDMETHOD(GetLCID)(LCID *plcid) ;
STDMETHOD(GetItemInfo)(LPCOLESTR pstrName,DWORD dwReturnMask,
IUnknown * *ppiunkItem,ITypeInfo * *ppti) ;
STDMETHOD(GetDocVersionString)(BSTR *pbstrVersion) ;
STDMETHOD(OnScriptTerminate)(const VARIANT *pvarResult,const EXCEPINFO *pexcepinfo) ;
STDMETHOD(OnStateChange)(SCRIPTSTATE ssScriptState) ;
STDMETHOD(OnScriptError)(IActiveScriptError *pscripterror) ;
STDMETHOD(OnEnterScript)(void) ;
STDMETHOD(OnLeaveScript)(void) ;
STDMETHOD(GetWindow)(HWND *phwnd) ;
STDMETHOD(EnableModeless)(BOOL fEnable);
public:
IActiveScript* m_ps;
IActiveScriptParse* m_psp;
private:
LONG m_cRef;
CLSID m_clsidEngine;
LPUNKNOWN m_lpUnkCtrl;
LPOLESTR m_pNamedItem;
HWND m_Wnd;
};
#include "StdAfx.h"
#include "ScriptHost.h"
#include <sys/stat.h>
CScriptHost::CScriptHost(LPUNKNOWN lpUnkCtrl, LPCOLESTR pNamedItem , HWND hWnd)
: m_ps(NULL),m_psp(NULL),m_cRef(0)
{
m_lpUnkCtrl = lpUnkCtrl;
m_pNamedItem = const_cast<LPOLESTR>(pNamedItem);
m_Wnd = hWnd;
static CLSID const clsid =
{0xb54f3741, 0x5b07, 0x11cf, {0xa4, 0xb0, 0x0, 0xaa, 0x0, 0x4a, 0x55, 0xe8}};
m_clsidEngine = clsid;
}
CScriptHost::~CScriptHost()
{
if(m_psp)
m_psp->Release();
if(m_ps)
{
m_ps->Close();
m_ps->Release();
}
}
HRESULT CScriptHost::CreateScriptEngine()
{
HRESULT hr = S_OK;
hr = ::CoCreateInstance(m_clsidEngine, NULL, CLSCTX_INPROC_SERVER,
IID_IActiveScript,(void**)&m_ps);
if ( SUCCEEDED( hr ) )
{
hr = m_ps->QueryInterface(IID_IActiveScriptParse, (void**)&m_psp);
if (FAILED(hr) )
{
m_ps->Release();
return hr;
}
IActiveScriptSite* Iass = static_cast<IActiveScriptSite*>(this);
hr = m_ps->SetScriptSite(Iass);
if ( FAILED( hr ) )
return hr;
m_ps->SetScriptState(SCRIPTSTATE_INITIALIZED);
hr = m_psp->InitNew();
if ( FAILED( hr ) )
return hr;
hr = m_ps->AddNamedItem(m_pNamedItem,
SCRIPTITEM_ISVISIBLE | SCRIPTITEM_ISSOURCE);
}
return hr;
}
HRESULT CScriptHost::ParseFile(const char * pszFileName, LPCOLESTR pstrItemName)
{
HRESULT hr = S_OK;
struct _stat stat;
size_t cch;
EXCEPINFO ei;
FILE *pfile;
if(::_stat(pszFileName,&stat))
return E_FAIL;
cch = stat.st_size;
char* pszAlloc = new char[cch + 1];
pszAlloc[cch] = '\0'; if(pszAlloc == NULL)
return E_OUTOFMEMORY;
memset(pszAlloc,0,cch);
pfile = fopen(pszFileName,"rb");
if ( !pfile )
{
hr = E_FAIL;
return hr;
}
fread(pszAlloc,cch,1,pfile);
fclose(pfile);
LPOLESTR pwszCode;
int CharCount = MultiByteToWideChar(CP_ACP,0,pszAlloc,-1,NULL,0);
pwszCode = new WCHAR[CharCount];
MultiByteToWideChar(CP_ACP,0,pszAlloc,-1,pwszCode,CharCount);
size_t t = wcslen(pwszCode);
hr = m_psp->ParseScriptText(pwszCode, pstrItemName,NULL, NULL, 0,0,0L,NULL,&ei);
delete []pwszCode;
delete []pszAlloc;
return hr;
}
STDMETHODIMP CScriptHost::GetItemInfo(LPCOLESTR pstrName,DWORD dwReturnMask,
IUnknown **ppiunkItem, ITypeInfo **ppti)
{
HRESULT hr = S_OK;
if(dwReturnMask & SCRIPTINFO_ITYPEINFO)
{
if(ppti == NULL)
return E_INVALIDARG;
*ppti = NULL;
}
if(dwReturnMask & SCRIPTINFO_IUNKNOWN)
{
if(ppiunkItem == NULL)
return E_INVALIDARG;
*ppiunkItem = NULL;
}
if(!_wcsicmp(m_pNamedItem, pstrName))
{
if(dwReturnMask & SCRIPTINFO_IUNKNOWN)
{
*ppiunkItem = m_lpUnkCtrl;
static_cast<IUnknown*>(*ppiunkItem)->AddRef();
}
if(dwReturnMask & SCRIPTINFO_ITYPEINFO)
{
IProvideClassInfo* pClsInfo = NULL;
hr = m_lpUnkCtrl->QueryInterface(IID_IProvideClassInfo, (void**)&pClsInfo);
if(pClsInfo != NULL)
{
hr = pClsInfo->GetClassInfo(ppti);
pClsInfo->Release();
}
}
}
return hr;
}
HRESULT CScriptHost::GetWindow(HWND *phwnd)
{
if (m_Wnd != NULL)
{
*phwnd = m_Wnd;
return S_OK;
}
else
{
return E_FAIL;
}
}
STDMETHODIMP CScriptHost::GetLCID(LCID *plcid)
{
return E_NOTIMPL;
}
STDMETHODIMP CScriptHost::GetDocVersionString(BSTR *pbstrVersion)
{
return E_NOTIMPL;
}
STDMETHODIMP CScriptHost::OnScriptTerminate(const VARIANT *pvarResult,const EXCEPINFO *pexcepinfo)
{
return S_OK;
}
STDMETHODIMP CScriptHost::OnStateChange(SCRIPTSTATE ssScriptState)
{
return S_OK;
}
STDMETHODIMP CScriptHost::OnScriptError(IActiveScriptError *pscripterror)
{
return S_OK;
}
STDMETHODIMP CScriptHost::OnEnterScript(void)
{
return S_OK;
}
STDMETHODIMP CScriptHost::OnLeaveScript(void)
{
return S_OK;
}
STDMETHODIMP CScriptHost::EnableModeless(BOOL fEnable)
{
return S_OK;
}
ULONG CScriptHost::AddRef()
{
::InterlockedIncrement(&m_cRef);
return m_cRef;
}
ULONG CScriptHost::Release()
{
::InterlockedDecrement(&m_cRef);
return m_cRef;
}
STDMETHODIMP CScriptHost::QueryInterface(REFIID riid,void** ppvObj)
{
return S_OK;
}
When function "SetScriptSite" is called in function "CreateScriptEngine", error occurs:
Unhandled exception at 0x7327c96b in CScriptTest.exe: 0xC0000005: Access violation reading location 0x00000000.
I have just got to ActiveX Scripting, i have googled a lot, still i can't solve the problem.
Who can tell me where it is wrong?