?? activescripthost.cpp
字號(hào):
void CActiveScriptHost::DestroyDataHelper(LPVOID lpvData)
{
CoTaskMemFree(lpvData);
}
///////////////////////////////////////////////////////////////////////////
// InvokeFuncHelper
HRESULT CActiveScriptHost::InvokeFuncHelper(LPCOLESTR lpszName, VARIANT* pvarParams,
int nParams, VARIANT* pvarRet /*= NULL*/)
{
HRESULT hr = E_FAIL;
if (m_pAxsScript != NULL && lpszName != NULL)
{
DISPID dispid;
LPDISPATCH pDisp = NULL;
DISPPARAMS dispparams = { pvarParams, NULL, nParams, 0};
hr = m_pAxsScript->GetScriptDispatch(0, &pDisp);
if (SUCCEEDED(hr))
hr = pDisp->GetIDsOfNames(IID_NULL, (LPOLESTR*)&lpszName, 1, LOCALE_SCRIPT_DEFAULT, &dispid);
if (SUCCEEDED(hr))
hr = pDisp->Invoke(dispid, IID_NULL, LOCALE_SCRIPT_DEFAULT, DISPATCH_METHOD, &dispparams, pvarRet, NULL, NULL);
}
return hr;
}
///////////////////////////////////////////////////////////////////////////////
// Methods
/////////////////////////////////////////////////////////////////////////////
// IActiveScriptSite Implementation
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSite::AddRef
STDMETHODIMP_(ULONG)CActiveScriptHost::XActiveScriptSite::AddRef()
{
METHOD_PROLOGUE(CActiveScriptHost, ActiveScriptSite)
return pThis->ExternalAddRef();
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSite::Release
STDMETHODIMP_(ULONG)CActiveScriptHost::XActiveScriptSite::Release()
{
METHOD_PROLOGUE(CActiveScriptHost, ActiveScriptSite)
return pThis->ExternalRelease();
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSite::QueryInterface
STDMETHODIMP CActiveScriptHost::XActiveScriptSite::QueryInterface(
REFIID iid, void FAR* FAR* ppvObj)
{
METHOD_PROLOGUE(CActiveScriptHost, ActiveScriptSite)
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSite::GetLCID
STDMETHODIMP CActiveScriptHost::XActiveScriptSite::GetLCID(LCID* plcid)
{
METHOD_PROLOGUE(CActiveScriptHost, ActiveScriptSite)
*plcid = LOCALE_SCRIPT_DEFAULT; // Default LCID: english-neutral
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSite::GetItemInfo
STDMETHODIMP CActiveScriptHost::XActiveScriptSite::GetItemInfo(
/* [in] */ LPCOLESTR pstrName,
/* [in] */ DWORD dwReturnMask,
/* [out] */LPUNKNOWN* ppiunkItem,
/* [out] */LPTYPEINFO* ppti)
{
HRESULT hr = S_OK;
METHOD_PROLOGUE(CActiveScriptHost, ActiveScriptSite)
USES_CONVERSION;
TRACE("GetItemInfo: Name = %s Mask = %x\n", OLE2CT(pstrName), dwReturnMask);
if (dwReturnMask & SCRIPTINFO_ITYPEINFO)
{
if (!ppti)
return E_INVALIDARG;
*ppti = NULL;
}
if (dwReturnMask & SCRIPTINFO_IUNKNOWN)
{
if (!ppiunkItem)
return E_INVALIDARG;
*ppiunkItem = NULL;
}
// Global object
if (!_wcsicmp(ACTIVS_HOST, pstrName))
{
if (dwReturnMask & SCRIPTINFO_ITYPEINFO)
{
CLSID clsid = CLSID_NULL;
pThis->GetDispatchIID( &clsid );
pThis->GetTypeInfoOfGuid(0 /* lcid unknown! */, clsid, ppti);
if (*ppti)
(*ppti)->AddRef(); // because returning
}
if (dwReturnMask & SCRIPTINFO_IUNKNOWN)
{
*ppiunkItem = pThis->GetIDispatch(TRUE);
(*ppiunkItem)->AddRef(); // because returning
}
return S_OK;
}
// Check map for named item
LPUNKNOWN lpUnknown = NULL;
if (!(pThis->mapNamedItems.Lookup(OLE2CT(pstrName), (LPVOID&) lpUnknown)))
{
return TYPE_E_ELEMENTNOTFOUND;
}
ASSERT(NULL != lpUnknown);
if (NULL == lpUnknown)
{
TRACE("No IUnknown for item!\n");
// This shouldn't ever happen, since we're providing the items
return E_FAIL;
}
if (dwReturnMask & SCRIPTINFO_ITYPEINFO)
{
// Use IProvideClassInfo to get ITypeInfo of coclass!
IProvideClassInfo *pci = NULL;
hr = lpUnknown->QueryInterface(IID_IProvideClassInfo, (void**)&pci);
if (SUCCEEDED(hr) && pci)
hr = pci->GetClassInfo(ppti);
else
{
CLSID clsid = CLSID_NULL;
pThis->GetDispatchIID( &clsid );
hr = LoadTypeInfoFromModule(clsid, ppti);
}
// Release interface
if (pci)
pci->Release();
if (FAILED(hr))
return E_FAIL;
}
if (dwReturnMask & SCRIPTINFO_IUNKNOWN)
{
*ppiunkItem = lpUnknown;
(*ppiunkItem)->AddRef(); // because returning
}
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSite::GetDocVersionString
STDMETHODIMP CActiveScriptHost::XActiveScriptSite::GetDocVersionString(LPBSTR pbstrVersion)
{
METHOD_PROLOGUE(CActiveScriptHost, ActiveScriptSite)
return E_NOTIMPL;
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSite::OnScriptTerminate
STDMETHODIMP CActiveScriptHost::XActiveScriptSite::OnScriptTerminate(
/* [in] */ const VARIANT* pvarResult,
/* [in] */ const EXCEPINFO* pexcepinfo)
{
METHOD_PROLOGUE(CActiveScriptHost, ActiveScriptSite)
m_running = FALSE;
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSite::OnStateChange
STDMETHODIMP CActiveScriptHost::XActiveScriptSite::OnStateChange(
/* [in] */ SCRIPTSTATE ssScriptState)
{
METHOD_PROLOGUE(CActiveScriptHost, ActiveScriptSite)
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSite::OnScriptError
STDMETHODIMP CActiveScriptHost::XActiveScriptSite::OnScriptError(
/* [in] */ IActiveScriptError* pse)
{
METHOD_PROLOGUE_EX(CActiveScriptHost, ActiveScriptSite)
EXCEPINFO ei;
DWORD dwSrcContext;
ULONG ulLine;
LONG ichError;
BSTR bstrLine = NULL;
CString strError;
pse->GetExceptionInfo(&ei);
pse->GetSourcePosition(&dwSrcContext, &ulLine, &ichError);
pse->GetSourceLineText(&bstrLine);
CString desc;
CString src;
desc = (LPCWSTR)ei.bstrDescription;
src = (LPCWSTR)ei.bstrSource;
strError.Format("%s\nSrc: %s\nLine:%d Error:%d Scode:%x", desc, src, ulLine, (int)ei.wCode, ei.scode);
pGlobalDialog->AddCommsDebugString("SCRIPT ERROR!!!!!!");
pGlobalDialog->AddCommsDebugString(strError);
pGlobalDialog->SetLastScriptErrorString(strError);
m_running = FALSE;
TRACE(strError);
TRACE("\n");
//AfxMessageBox(strError, MB_SETFOREGROUND);
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSite::OnEnterScript
STDMETHODIMP CActiveScriptHost::XActiveScriptSite::OnEnterScript()
{
METHOD_PROLOGUE(CActiveScriptHost, ActiveScriptSite)
TRACE("OnEnterScript\n");
//CActiveScriptHost::_OnEnterScript()
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSite::OnLeaveScript
STDMETHODIMP CActiveScriptHost::XActiveScriptSite::OnLeaveScript()
{
METHOD_PROLOGUE(CActiveScriptHost, ActiveScriptSite)
TRACE("OnLeaveScript\n");
m_running = FALSE;
//_OnLeaveScript()
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
// IActiveScriptSiteWindow Implementation
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSiteWindow::AddRef
STDMETHODIMP_(ULONG) CActiveScriptHost::XActiveScriptSiteWindow::AddRef()
{
METHOD_PROLOGUE_EX_(CActiveScriptHost, ActiveScriptSiteWindow)
return pThis->ExternalAddRef();
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSiteWindow::Release
STDMETHODIMP_(ULONG) CActiveScriptHost::XActiveScriptSiteWindow::Release()
{
METHOD_PROLOGUE_EX_(CActiveScriptHost, ActiveScriptSiteWindow)
return pThis->ExternalRelease();
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSiteWindow::QueryInterface
STDMETHODIMP CActiveScriptHost::XActiveScriptSiteWindow::QueryInterface(REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(CActiveScriptHost, ActiveScriptSiteWindow)
return pThis->ExternalQueryInterface(&iid, ppvObj);
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSiteWindow::EnableModeless
STDMETHODIMP CActiveScriptHost::XActiveScriptSiteWindow::EnableModeless(BOOL fEnable)
{
METHOD_PROLOGUE_EX_(CActiveScriptHost, ActiveScriptSiteWindow)
return S_OK;
}
///////////////////////////////////////////////////////////////////////////////
// XActiveScriptSiteWindow::GetWindow
STDMETHODIMP CActiveScriptHost::XActiveScriptSiteWindow::GetWindow(HWND* phWnd)
{
METHOD_PROLOGUE_EX_(CActiveScriptHost, ActiveScriptSiteWindow)
*phWnd = pThis->m_hHostWnd;
if (*phWnd)
return S_OK;
return E_FAIL;
}
///////////////////////////////////////////////////////////////////////////////
// LoadTypeInfoFromModule
HRESULT LoadTypeInfoFromModule(REFIID riid, ITypeInfo **ppti)
{
*ppti = 0;
char szFileName[MAX_PATH];
GetModuleFileNameA(0, szFileName, MAX_PATH);
OLECHAR wszFileName[MAX_PATH];
mbstowcs(wszFileName, szFileName, MAX_PATH);
ITypeLib *ptl = 0;
HRESULT hr = LoadTypeLib(wszFileName, &ptl);
if (SUCCEEDED(hr))
{
hr = ptl->GetTypeInfoOfGuid(riid, ppti);
ptl->Release();
}
return hr;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -