我在调吕 思 伟 、潘 爱 民 在《微电脑世界周刊》上发表的《ActiveX Scripting 技 术》一文的程序时,执行到HRESULT CScriptHost::CreateScriptEngine()的hr = m_ps- >SetScriptSite(this);一句时总是出现“ox759e234b指令引用的ox00000000内存不能为read”和“Unhandled exception in script.exe(VBSCRIPT.DLL):oX000000005:Access Violation. ”错误,请指教!
this指针已指向CScriptHost* m_pScHost.
this指针已指向CScriptHost* m_pScHost.
{
public:
CScriptHost(LPUNKNOWN lpUnkCtrl, LPCOLESTR
pNamedItem, HWND hWnd);
virtual ~CScriptHost();
HRESULT CreateScriptEngine();
HRESULT ParseFile(const char*
pszFileName,LPCOLESTR pstrItemName); public:
//IUnknown members
STDMETHOD(QueryInterface)(REFIID riid,void** ppvObj);
STDMETHOD_(unsigned long,AddRef)(void);
STDMETHOD_(unsigned long,Release)(); //IActiveScriptSite members
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) ; //IActiveScriptSiteWindow members
STDMETHOD(GetWindow)(HWND *phwnd) ;
STDMETHOD(EnableModeless)(BOOL fEnable); public:
IActiveScript* m_ps;
IActiveScriptParse* m_psp; private:
UINT m_cref;
CLSID m_clsidEngine;
LPUNKNOWN m_lpUnkCtrl;
LPOLESTR m_pNamedItem;
HWND m_Wnd;
};void CScriptDlg::OnLoadscript()
{
CFileDialog dlg(TRUE, "*.txt","*.txt",OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT,"Text files (*.txt)"); if(dlg.DoModal()==IDOK)
{
CString strPath;
strPath = dlg.GetPathName();
if (strPath.IsEmpty())
return;
if (m_pScHost != NULL)
m_pScHost->m_ps->Close();
CWnd *pCalander = GetDlgItem(IDC_CONTROL1);
m_pUnknownCtrl = pCalander- >GetControlUnknown(); m_pScHost = new CScriptHost(m_pUnknownCtrl, L"control", m_hWnd);
HRESULT hr = m_pScHost->CreateScriptEngine();
hr = m_pScHost- >ParseFile(strPath,L"control");
GetDlgItem(IDC_RUNSCRIPT)->EnableWindow(TRUE);
GetDlgItem(IDC_RUNSCRIPT)- >SetWindowText("Run Script");
return;
}
CScriptHost::CScriptHost(LPUNKNOWN lpUnkCtrl,
LPCOLESTR pNamedItem , HWND hWnd)
: m_ps(NULL),m_psp(NULL),m_cref(0)
{
m_lpUnkCtrl = lpUnkCtrl;
m_pNamedItem = pNamedItem;
m_Wnd = hWnd; // the clsid of VBScript Engine
static CLSID const clsid = {0xb54f3741, 0x5b07, 0x11cf,
{0xa4, 0xb0, 0x0, 0xaa, 0x0, 0x4a, 0x55, 0xe8}}; // Default to VBScript
m_clsidEngine = clsid;
} CScriptHost::~CScriptHost()
{
if(m_psp)
m_psp- >Release(); // we must first close the script engine
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))
{
// QI the IActiveScriptParse pointer
hr = m_ps- >QueryInterface(IID_IActiveScriptParse,
(void**)&m_psp);
if (FAILED(hr) )
{
m_ps- >Release();
return hr;
} // set the script site
hr = m_ps- >SetScriptSite(this);
if ( FAILED( hr ) )
return hr; m_ps- >SetScriptState(SCRIPTSTATE_INITIALIZED);
// initiate the script engine
hr = m_psp- >InitNew();
if (FAILED(hr))
return hr; hr = m_ps- >AddNamedItem(m_pNamedItem,
SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE);
} return hr;
}
let me see