c语言vbs,如何在C中加载和调用VBScript函数?

我已经整理了一个“Hello World”IActiveScript C ATL控制台应用程序:

>定义CSimpleScriptSite类

>实现IActiveScriptSite接口(必填)

>实现IActiveScriptSiteWindow接口(可选)

>使用虚拟存根实现大多数功能的最小实现

>没有错误处理.请参阅MSDN IActiveScriptError.

>使用CoCreateInstance新的IActiveSite对象

>创建VBScript和JScript的实例

>使用IActiveSite :: SetScriptSite将IActiveSite链接到IActiveScriptSite

>调用QueryInterface以获取IActiveScriptParse接口

>使用IActiveScriptParse执行VBScript或JScript代码

>样本:

>在JScript中计算表达式

>评估VBScript中的表达式

>在VBScript中运行命令

码:

#include "stdafx.h"

#include

#include

class CSimpleScriptSite :

public IActiveScriptSite,public IActiveScriptSiteWindow

{

public:

CSimpleScriptSite() : m_cRefCount(1),m_hWnd(NULL) { }

// IUnknown

STDMETHOD_(ULONG,AddRef)();

STDMETHOD_(ULONG,Release)();

STDMETHOD(QueryInterface)(REFIID riid,void **ppvObject);

// IActiveScriptSite

STDMETHOD(GetLCID)(LCID *plcid){ *plcid = 0; return S_OK; }

STDMETHOD(GetItemInfo)(LPCOLESTR pstrName,DWORD dwReturnMask,IUnknown **ppiunkItem,ITypeInfo **ppti) { return TYPE_E_ELEMENTNOTFOUND; }

STDMETHOD(GetDocVersionString)(BSTR *pbstrVersion) { *pbstrVersion = SysAllocString(L"1.0"); return S_OK; }

STDMETHOD(OnScriptTerminate)(const VARIANT *pvarResult,const EXCEPINFO *pexcepinfo) { return S_OK; }

STDMETHOD(OnStateChange)(SCRIPTSTATE ssScriptState) { return S_OK; }

STDMETHOD(OnScriptError)(IActiveScriptError *pIActiveScriptError) { return S_OK; }

STDMETHOD(OnEnterScript)(void) { return S_OK; }

STDMETHOD(OnLeaveScript)(void) { return S_OK; }

// IActiveScriptSiteWindow

STDMETHOD(GetWindow)(HWND *phWnd) { *phWnd = m_hWnd; return S_OK; }

STDMETHOD(EnableModeless)(BOOL fEnable) { return S_OK; }

// Miscellaneous

HRESULT SetWindow(HWND hWnd) { m_hWnd = hWnd; return S_OK; }

public:

LONG m_cRefCount;

HWND m_hWnd;

};

STDMETHODIMP_(ULONG) CSimpleScriptSite::AddRef()

{

return InterlockedIncrement(&m_cRefCount);

}

STDMETHODIMP_(ULONG) CSimpleScriptSite::Release()

{

if (!InterlockedDecrement(&m_cRefCount))

{

delete this;

return 0;

}

return m_cRefCount;

}

STDMETHODIMP CSimpleScriptSite::QueryInterface(REFIID riid,void **ppvObject)

{

if (riid == IID_IUnknown || riid == IID_IActiveScriptSiteWindow)

{

*ppvObject = (IActiveScriptSiteWindow *) this;

AddRef();

return NOERROR;

}

if (riid == IID_IActiveScriptSite)

{

*ppvObject = (IActiveScriptSite *) this;

AddRef();

return NOERROR;

}

return E_NOINTERFACE;

}

int _tmain(int argc,_TCHAR* argv[])

{

HRESULT hr = S_OK;

hr = CoInitializeEx(NULL,COINIT_MULTITHREADED);

// Initialize

CSimpleScriptSite* pScriptSite = new CSimpleScriptSite();

CComPtr spJScript;

CComPtr spJScriptParse;

hr = spJScript.CoCreateInstance(OLESTR("JScript"));

hr = spJScript->SetScriptSite(pScriptSite);

hr = spJScript->QueryInterface(&spJScriptParse);

hr = spJScriptParse->InitNew();

CComPtr spVBScript;

CComPtr spVBScriptParse;

hr = spVBScript.CoCreateInstance(OLESTR("VBScript"));

hr = spVBScript->SetScriptSite(pScriptSite);

hr = spVBScript->QueryInterface(&spVBScriptParse);

hr = spVBScriptParse->InitNew();

// Run some scripts

CComVariant result;

EXCEPINFO ei = { };

hr = spJScriptParse->ParseScriptText(OLESTR("(new Date()).getTime()"),NULL,SCRIPTTEXT_ISEXPRESSION,&result,&ei);

hr = spVBScriptParse->ParseScriptText(OLESTR("Now"),&ei);

hr = spVBScriptParse->ParseScriptText(OLESTR("MsgBox \"Hello World! The current time is: \" & Now"),&ei);

// Cleanup

spVBScriptParse = NULL;

spVBScript = NULL;

spJScriptParse = NULL;

spJScript = NULL;

pScriptSite->Release();

pScriptSite = NULL;

::CoUninitialize();

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值