📄 cwsh.cpp
字号:
// $Id: CWSH.cpp,v 1.9 2005/01/30 16:27:52 Administrator Exp $
/*! @file
@brief WSH Handler
@author 鬼
@date 2002年4月28日
*/
/*
Copyright (C) 2002, 鬼
This source code is designed for sakura editor.
Please contact the copyright holder to use this code for other purpose.
*/
#include "CWSH.h"
#include "CWSHManager.h"
#include "CMacroFactory.h"
#include "CMacro.h"
#include "CSMacroMgr.h"
#include "CEditView.h"
#include "CEditDoc.h"
#include "etc_uty.h"
#include "OleTypes.h"
//スクリプトに渡されるオブジェクトの情報
class CInterfaceObjectTypeInfo: public ImplementsIUnknown<ITypeInfo>
{
private:
CInterfaceObject *m_Object;
TYPEATTR m_TypeAttr;
public:
CInterfaceObjectTypeInfo(CInterfaceObject *AObject);
virtual HRESULT STDMETHODCALLTYPE GetTypeAttr(
/* [out] */ TYPEATTR __RPC_FAR *__RPC_FAR *ppTypeAttr)
{
#ifdef TEST
cout << "GetTypeAttr" << endl;
#endif
*ppTypeAttr = &m_TypeAttr;
return S_OK;
}
virtual HRESULT STDMETHODCALLTYPE GetTypeComp(
/* [out] */ ITypeComp __RPC_FAR *__RPC_FAR *ppTComp)
{
#ifdef TEST
cout << "GetTypeComp" << endl;
#endif
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetFuncDesc(
/* [in] */ UINT index,
/* [out] */ FUNCDESC __RPC_FAR *__RPC_FAR *ppFuncDesc);
virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetVarDesc(
/* [in] */ UINT index,
/* [out] */ VARDESC __RPC_FAR *__RPC_FAR *ppVarDesc)
{
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetNames(
/* [in] */ MEMBERID memid,
/* [length_is][size_is][out] */ BSTR __RPC_FAR *rgBstrNames,
/* [in] */ UINT cMaxNames,
/* [out] */ UINT __RPC_FAR *pcNames);
virtual HRESULT STDMETHODCALLTYPE GetRefTypeOfImplType(
/* [in] */ UINT index,
/* [out] */ HREFTYPE __RPC_FAR *pRefType)
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetImplTypeFlags(
/* [in] */ UINT index,
/* [out] */ INT __RPC_FAR *pImplTypeFlags)
{
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetIDsOfNames(
/* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,
/* [in] */ UINT cNames,
/* [size_is][out] */ MEMBERID __RPC_FAR *pMemId)
{
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke(
/* [in] */ PVOID pvInstance,
/* [in] */ MEMBERID memid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,
/* [out] */ VARIANT __RPC_FAR *pVarResult,
/* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,
/* [out] */ UINT __RPC_FAR *puArgErr)
{
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDocumentation(
/* [in] */ MEMBERID memid,
/* [out] */ BSTR __RPC_FAR *pBstrName,
/* [out] */ BSTR __RPC_FAR *pBstrDocString,
/* [out] */ DWORD __RPC_FAR *pdwHelpContext,
/* [out] */ BSTR __RPC_FAR *pBstrHelpFile)
{
// Feb. 08, 2004 genta
// とりあえず全部NULLを返す (情報無し)
pBstrName = NULL;
pBstrDocString = NULL;
pdwHelpContext = NULL;
pBstrHelpFile = NULL;
return S_OK ;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetDllEntry(
/* [in] */ MEMBERID memid,
/* [in] */ INVOKEKIND invKind,
/* [out] */ BSTR __RPC_FAR *pBstrDllName,
/* [out] */ BSTR __RPC_FAR *pBstrName,
/* [out] */ WORD __RPC_FAR *pwOrdinal)
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetRefTypeInfo(
/* [in] */ HREFTYPE hRefType,
/* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo)
{
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE AddressOfMember(
/* [in] */ MEMBERID memid,
/* [in] */ INVOKEKIND invKind,
/* [out] */ PVOID __RPC_FAR *ppv)
{
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE CreateInstance(
/* [in] */ IUnknown __RPC_FAR *pUnkOuter,
/* [in] */ REFIID riid,
/* [iid_is][out] */ PVOID __RPC_FAR *ppvObj)
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetMops(
/* [in] */ MEMBERID memid,
/* [out] */ BSTR __RPC_FAR *pBstrMops)
{
return E_NOTIMPL;
}
virtual /* [local] */ HRESULT STDMETHODCALLTYPE GetContainingTypeLib(
/* [out] */ ITypeLib __RPC_FAR *__RPC_FAR *ppTLib,
/* [out] */ UINT __RPC_FAR *pIndex)
{
return E_NOTIMPL;
}
virtual /* [local] */ void STDMETHODCALLTYPE ReleaseTypeAttr(
/* [in] */ TYPEATTR __RPC_FAR *pTypeAttr)
{
}
virtual /* [local] */ void STDMETHODCALLTYPE ReleaseFuncDesc(
/* [in] */ FUNCDESC __RPC_FAR *pFuncDesc)
{
}
virtual /* [local] */ void STDMETHODCALLTYPE ReleaseVarDesc(
/* [in] */ VARDESC __RPC_FAR *pVarDesc)
{
}
};
//IActiveScriptSite
class CWSHSite: public ImplementsIUnknown<IActiveScriptSite>
{
private:
CWSHClient *m_Client;
ITypeInfo *m_TypeInfo;
public:
CWSHSite(CWSHClient *AClient): ImplementsIUnknown<IActiveScriptSite>(), m_Client(AClient)
{
}
virtual HRESULT STDMETHODCALLTYPE GetLCID(
/* [out] */ LCID *plcid)
{
#ifdef TEST
cout << "GetLCID" << endl;
#endif
return E_NOTIMPL; //システムデフォルトを使用
};
virtual HRESULT STDMETHODCALLTYPE GetItemInfo(
/* [in] */ LPCOLESTR pstrName,
/* [in] */ DWORD dwReturnMask,
/* [out] */ IUnknown **ppiunkItem,
/* [out] */ ITypeInfo **ppti)
{
#ifdef TEST
wcout << L"GetItemInfo:" << pstrName << endl;
#endif
// Nov. 10, 2003 FILE Win9Xでは、[lstrcmpiW]が無効のため、[_wcsicmp]に修正
if(_wcsicmp(pstrName, L"Editor") == 0)
{
if(dwReturnMask & SCRIPTINFO_IUNKNOWN)
{
(*ppiunkItem) = m_Client->m_InterfaceObject;
(*ppiunkItem)->AddRef();
}
if(dwReturnMask & SCRIPTINFO_ITYPEINFO)
{
m_Client->m_InterfaceObject->GetTypeInfo(0, 0, ppti);
}
return S_OK;
}
return TYPE_E_ELEMENTNOTFOUND;
};
virtual HRESULT STDMETHODCALLTYPE GetDocVersionString(
/* [out] */ BSTR *pbstrVersion)
{
#ifdef TEST
cout << "GetDocVersionString" << endl;
#endif
return E_NOTIMPL;
};
virtual HRESULT STDMETHODCALLTYPE OnScriptTerminate(
/* [in] */ const VARIANT *pvarResult,
/* [in] */ const EXCEPINFO *pexcepinfo)
{
#ifdef TEST
cout << "OnScriptTerminate" << endl;
#endif
return S_OK;
};
virtual HRESULT STDMETHODCALLTYPE OnStateChange(
/* [in] */ SCRIPTSTATE ssScriptState)
{
#ifdef TEST
cout << "OnStateChange" << endl;
#endif
return S_OK;
};
// Nov. 3, 2002 鬼
// エラー行番号表示対応
virtual HRESULT STDMETHODCALLTYPE OnScriptError(
/* [in] */ IActiveScriptError *pscripterror)
{
EXCEPINFO Info;
if(pscripterror->GetExceptionInfo(&Info) == S_OK)
{
DWORD Context;
ULONG Line;
LONG Pos;
if(pscripterror->GetSourcePosition(&Context, &Line, &Pos) == S_OK)
{
wchar_t *Message = new wchar_t[SysStringLen(Info.bstrDescription) + 128];
// Nov. 10, 2003 FILE Win9Xでは、[wsprintfW]が無効のため、[swprintf]に修正
swprintf(Message, L"[Line %d] %ls", Line + 1, Info.bstrDescription);
SysReAllocString(&Info.bstrDescription, Message);
delete[] Message;
}
m_Client->Error(Info.bstrDescription, Info.bstrSource);
SysFreeString(Info.bstrSource);
SysFreeString(Info.bstrDescription);
SysFreeString(Info.bstrHelpFile);
}
return S_OK;
};
virtual HRESULT STDMETHODCALLTYPE OnEnterScript() {
#ifdef TEST
cout << "OnEnterScript" << endl;
#endif
return S_OK;
};
virtual HRESULT STDMETHODCALLTYPE OnLeaveScript() {
#ifdef TEST
cout << "OnLeaveScript" << endl;
#endif
return S_OK;
};
};
//implementation
CInterfaceObjectTypeInfo::CInterfaceObjectTypeInfo(CInterfaceObject *AObject)
: ImplementsIUnknown<ITypeInfo>(), m_Object(AObject)
{
ZeroMemory(&m_TypeAttr, sizeof(TYPEATTR));
m_TypeAttr.cImplTypes = 0; //親クラスのITypeInfoの数
m_TypeAttr.cFuncs = m_Object->m_Methods.size();
}
HRESULT STDMETHODCALLTYPE CInterfaceObjectTypeInfo::GetFuncDesc(
/* [in] */ UINT index,
/* [out] */ FUNCDESC __RPC_FAR *__RPC_FAR *ppFuncDesc)
{
#ifdef TEST
cout << "GetFuncDesc" << endl;
#endif
*ppFuncDesc = &(m_Object->m_Methods[index].Desc);
return S_OK;
}
HRESULT STDMETHODCALLTYPE CInterfaceObjectTypeInfo::GetNames(
/* [in] */ MEMBERID memid,
/* [length_is][size_is][out] */ BSTR __RPC_FAR *rgBstrNames,
/* [in] */ UINT cMaxNames,
/* [out] */ UINT __RPC_FAR *pcNames)
{
#ifdef TEST
cout << "GetNames" << endl;
#endif
*pcNames = 1;
if(cMaxNames > 0)
*rgBstrNames = SysAllocString(m_Object->m_Methods[memid].Name);
return S_OK;
}
//スクリプトに渡されるオブジェクト
CInterfaceObject::CInterfaceObject(CWSHClient *AOwner): ImplementsIUnknown<IDispatch>(),
m_Methods(), m_TypeInfo(NULL), m_Owner(AOwner)
{
};
CInterfaceObject::~CInterfaceObject()
{
if(m_TypeInfo != NULL)
m_TypeInfo->Release();
}
HRESULT STDMETHODCALLTYPE CInterfaceObject::QueryInterface(REFIID iid, void ** ppvObject)
{
if(ppvObject == NULL)
return E_POINTER;
else if(IsEqualIID(iid, IID_IUnknown) || IsEqualIID(iid, IID_IDispatch))
{
AddRef();
*ppvObject = this;
return S_OK;
}
else
return E_NOINTERFACE;
}
HRESULT STDMETHODCALLTYPE CInterfaceObject::Invoke(
DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pdispparams,
VARIANT FAR* pvarResult,
EXCEPINFO FAR* pexcepinfo,
UINT FAR* puArgErr)
{
if((unsigned)dispidMember < m_Methods.size())
return (*m_Methods[dispidMember].Method)(m_Methods[dispidMember].ID, pdispparams, pvarResult, m_Owner->m_Data);
else
return E_UNEXPECTED;
}
HRESULT STDMETHODCALLTYPE CInterfaceObject::GetTypeInfo(
/* [in] */ UINT iTInfo,
/* [in] */ LCID lcid,
/* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -