如题,我想在程序中加载一段js脚本,在网上找了一个类CScriptObject,
现在已经可以加载js并执行里面的函数了,但是有一个问题,就是无法在线程中使用。
想问一下是什么原因?
这是一段例子代码。根据js内的函数名和参数执行,执行结果没问题void CScriptDemoDlg::OnBtnExecute() 
{
CString strParam, strProc;
m_ctlParameter.GetWindowText( strParam );
m_ctlFunctions.GetWindowText( strProc ); CSafeArrayHelper sfHelper;
try{
_variant_t var;
if (strParam.IsEmpty())
{
sfHelper.Create(VT_VARIANT, 1, 0, 0); // (void) parameter
}else
{ sfHelper.Create(VT_VARIANT, 1, 0, 1); // 1 parameter
var = _bstr_t(strParam);
}
sfHelper.PutElement(0, (void*)&var); // parameter1 -> index 0
LPSAFEARRAY sa =  sfHelper.GetArray();
_variant_t varRet;
if (m_ScriptObj.RunProcedure(strProc, &sa, &varRet))
m_ctlResult.SetWindowText( (LPCTSTR)(_bstr_t(varRet)) );
else
{
CString strError = m_ScriptObj.GetErrorString();
m_ctlResult.SetWindowText( strError );
}
}
catch(...)
{
CString strError = m_ScriptObj.GetErrorString();
m_ctlResult.SetWindowText( strError );
}
//AfxBeginThread(AutoThread,this);  //如果把上面的代码剪切到线程里,解注这句话
}
但如果把函数内的代码放到一个线程里。如下,就失败了,为什么呢???
UINT __cdecl AutoThread(LPVOID lParam) //线程调用脚本不好使
{
CScriptDemoDlg * pDlg = (CScriptDemoDlg *)lParam;
CString strParam, strProc;
pDlg->m_ctlParameter.GetWindowText( strParam );
pDlg->m_ctlFunctions.GetWindowText( strProc );

CSafeArrayHelper sfHelper;
try{
_variant_t var;
if (strParam.IsEmpty())
{
sfHelper.Create(VT_VARIANT, 1, 0, 0); // (void) parameter
}else
{

sfHelper.Create(VT_VARIANT, 1, 0, 1); // 1 parameter
var = _bstr_t(strParam);
}
sfHelper.PutElement(0, (void*)&var); // parameter1 -> index 0
LPSAFEARRAY sa =  sfHelper.GetArray();
_variant_t varRet;
if (pDlg->m_ScriptObj.RunProcedure(strProc, &sa, &varRet))
pDlg->m_ctlResult.SetWindowText( (LPCTSTR)(_bstr_t(varRet)) );
else
{
CString strError = pDlg->m_ScriptObj.GetErrorString();
pDlg->m_ctlResult.SetWindowText( strError );
}
}
catch(...)
{
CString strError = pDlg->m_ScriptObj.GetErrorString();
pDlg->m_ctlResult.SetWindowText( strError );
}
return 0;
}