在CPP中調用Jscript中的函數
在C++中調用Jscript的函數非常簡單,Windows提供了一個msscript.ocx的控件,利用這個控件可以直接操作Jscript: 執行一段Jscript腳本,或者調用指定的函數。我寫了一個簡單的例子:
l 導入msscript.ocx。下面這條指令會在項目目錄中生成msscript.tli和msscript.tlh兩個文件,里面有msscript.ocx中所有接口的描述和IID的定義。
#import "msscript.ocx" no_namespace
|
l 聲明一個對象。
CComPtr<IScriptControl> m_iScriptControl;
|
l 創建對象實例
if(SUCCEEDED(m_iScriptControl.CoCreateInstance(__uuidof(ScriptControl))))
|
l 設置語言等屬性。
m_iScriptControl->PutLanguage(L"JScript");
m_iScriptControl->PutAllowUI(VARIANT_FALSE);
|
l 加入Jscript代碼。
m_iScriptControl->AddCode(L"function test(str1, str2) { return str1 + \"-ok-\" + str2; }");
|
l 獲得函數,這里要說明的是GetItem的參數是1到n,而不是0到n-1。
CComPtr<IScriptProcedureCollection> aProcedureSet = m_iScriptControl->GetProcedures();
long n = aProcedureSet->GetCount();
CComPtr<IScriptProcedure> aProcedure = aProcedureSet->GetItem(_variant_t(n));
_bstr_t strFunction = aProcedure->GetName();
|
l 準備函數參數。
VARIANT va = {0};
va.vt = VT_BSTR;
n = 2;
SAFEARRAYBOUND bounds[1] = {0};
bounds[0].cElements = n;
SAFEARRAY* psa = SafeArrayCreate(VT_VARIANT, 1, bounds);
long i = 0;
for(i = 0; i < n; i++)
{
va.bstrVal = SysAllocString(L"test");
SafeArrayPutElement(psa, &i, &va);
}
|
l 調用函數。
_variant_t Result = m_iScriptControl->Run(strFunction, &psa);
|
l 釋放參數。
for(i = 0; i < n; i++)
{
va.bstrVal = SysAllocString(L"test");
SafeArrayGetElement(psa, &i, &va);
SysFreeString(va.bstrVal);
}
SafeArrayDestroy(psa);