C++和JavaScript脚本的相互调用收藏
//
头文件
static
const
GUID IID_CExternal
=
{ 0x52fee9af, 0xb3b3, 0x4756, { 0x80, 0x10, 0xfe, 0xa8, 0xf9, 0xfd, 0xd3, 0x3f } }
;


class
CExternal:
public
IDispatch
{
public:
CExternal(HWND h);
virtual ~CExternal();
ULONG __stdcall AddRef() { return 1; }
ULONG __stdcall Release() { return 1; }

HRESULT __stdcall QueryInterface(REFIID riid, void FAR* FAR* ppv)
{
if (ppv == NULL)
return E_POINTER;
*ppv = NULL;
if (InlineIsEqualGUID(riid, IID_IUnknown))
{
*ppv = static_cast<IUnknown *>(this);
return S_OK;
}
if(InlineIsEqualGUID(riid, IID_IDispatch) )
{
*ppv = static_cast<IDispatch FAR *>(this);
return S_OK;
}
if(InlineIsEqualGUID(riid, IID_CExternal) )
{
*ppv = static_cast<CExternal *>(this);
return S_OK;
}
return E_NOINTERFACE;
}

HRESULT __stdcall GetTypeInfoCount(UINT FAR* pctinfo)
{
if (pctinfo == NULL)
{
return E_INVALIDARG;
}
// there is only one function
*pctinfo = 1;
return NOERROR;
}

HRESULT __stdcall GetTypeInfo(UINT iTInfo,LCID lcid,ITypeInfo FAR* FAR* ppTInfo)
{
if (ppTInfo == NULL)
return E_INVALIDARG;
*ppTInfo = NULL;
if (iTInfo != 0)
return DISP_E_BADINDEX;
*ppTInfo = m_typeinfo;
if (m_typeinfo!=NULL)
m_typeinfo->AddRef();
return NOERROR;
}

HRESULT __stdcall GetIDsOfNames(REFIID riid,OLECHAR FAR* FAR* rgszNames, unsigned int cNames, LCID lcid,DISPID FAR*rgdispid)
{
if(lstrcmpiW(*rgszNames,L"exec")==0)
{
*rgdispid=0;
return S_OK;
}
return E_FAIL;
}

HRESULT __stdcall Invoke(DISPID dispidMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS FAR* pdispparams,VARIANT FAR* pvarResult,EXCEPINFO FAR* pexcepinfo,UINT FAR* puArgErr)
{
if((DISPATCH_PROPERTYGET&wFlags || DISPATCH_METHOD&wFlags)
&& dispidMember==0)
{
CComBSTR sRet;
exec(pdispparams, &sRet);
if (DISPATCH_PROPERTYGET&wFlags)
{
pvarResult->vt=VT_BSTR;
pvarResult->bstrVal=sRet.Detach();
新一篇: WTL使用 | 旧一篇: WebBrowser2封装的容器
<script>function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>脚本调用C++相对比较容易,使用ATL组件只需要抛双接口即可,但在exe里如何做到呢?本文实现了在exe里脚本和C++的相互调用.在EXE里也需要对外抛送一个继承自IDispatch的接口.并需要重载它的所有接口。由于水平有限,所以难免有错。
















































































