在CPP中調用Jscript中的函數(轉)
在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);
有個開源的工具 clipp,clipp.sourceforge.net ,比 OCX 出色的多