在ActiveX里面写了一个方法来调用javascript方法
//向js发送信息
LRESULT CFXVTDoc::outputParam(CString fuctionName,const CArray<CString> &params)
{
extern IDispatch *pScript;
if(pScript==NULL){
return -1;
}
CComBSTR bstrMember(fuctionName); DISPID dispid;

HRESULT hr=pScript->GetIDsOfNames(IID_NULL,&bstrMember,1,LOCALE_SYSTEM_DEFAULT,&dispid);
if(FAILED(hr)){
#ifdef _DEBUG
switch(hr)
{
case E_OUTOFMEMORY:
MessageBox(NULL,"E_OUTOFMEMORY","outputParam Err",0);
break;
case DISP_E_UNKNOWNNAME:
MessageBox(NULL,"DISP_E_UNKNOWNNAME","outputParam Err",0);
break;
case DISP_E_UNKNOWNLCID:
MessageBox(NULL,"DISP_E_UNKNOWNLCID","outputParam Err",0);
break;
}
#endif
return -1;
} DISPPARAMS dispparams;
memset(&dispparams, 0, sizeof dispparams); int paramNum=params.GetCount();
VARIANT *pParams=new VARIANT[paramNum]; for( int i = 0; i<paramNum; i++)
{
CComBSTR bstr =params.GetAt(i); // back reading
bstr.CopyTo(&pParams[i].bstrVal);
pParams[i].vt = VT_BSTR;
}  dispparams.rgvarg = pParams;  
dispparams.cNamedArgs = 0;
dispparams.cArgs=paramNum; EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof excepInfo);
CComVariant vaResult;
UINT nArgErr = (UINT)-1;  // initialize to invalid arg
hr = pScript->Invoke(dispid,IID_NULL,0,DISPATCH_METHOD,&dispparams,&vaResult,&excepInfo,&nArgErr);
delete []dispparams.rgvarg;
return 1;
}
这个方法在主线程中调用一切正常,但到了自己写的线程中调用就会失败,爆出DISP_E_UNKNOWNNAME错误。查了好久,看到别人的贴子上说有些com方法是线程不安全的,所以不要用线程。是这样吗?
可我现在不用线程就不知道该怎么做。我这里一个操作过程是这样的。
activex调用js方法--->js做相应的操作-->js调用activex方法报告操作完成
整个过程是不可以重叠的。比如在第一次js方法调用后,如果还没有得到js的完成消息,是不可以启动二次js方法调用的。但这个对用户来说是透明的,用户可以一次提交多个操作请求。
所以我把操作请求放到队列中,通过CEvent来实现同步。如果不放到线程中就会出现在同步等待的时候界面死掉。这个怎么解决?