在js中使用com组件,将js中的一个函数作为回调函数设置给com组件;在主线程中调用这个回调函数没有问题,但是如果在另一个线程里面调用这个回调函数则总是失败,请哪位大拿解决一下这个问题?//初始化创建线程
STDMETHODIMP CJSCallBack::Initialize(void)
{
// TODO: 在此添加实现代码
DWORD dThreadId;
m_hThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CallJspFunctionThread, this, 0, &dThreadId);
return S_OK;
}//线程函数
UINT CJSCallBack::CallJspFunctionThread(LPVOID param)
{
CJSCallBack* pCallBack = (CJSCallBack*)param; while(m_bRunThread)
{
while(m_bCallJspFunc)
{
pCallBack->CallJsFunction();
m_bCallJspFunc = FALSE;
} Sleep(1);
}
return 0;
}//设置回调函数
STDMETHODIMP CJSCallBack::SetJsCallbackFunc(VARIANT scriptCallback)
{
// TODO: 在此添加实现代码
if (scriptCallback.vt == VT_DISPATCH)
{
m_spCallback = scriptCallback.pdispVal;
} return S_OK;
}
//调用回调函数
void CJSCallBack::CallJsFunction()
{
CComVariant avarParams[1];
avarParams[0] = m_szDisplay; //指定回调函数的参数
DISPPARAMS params = { avarParams, NULL, 1, 0 };
if(m_spCallback)
{
HRESULT hr = m_spCallback->Invoke(0,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
¶ms, NULL, NULL, NULL);
}
}
//触发调用回调函数
STDMETHODIMP CJSCallBack::Print(BSTR bstrToPrint, LONG lWait)
{
// TODO: 在此添加实现代码
_bstr_t bsPrint = bstrToPrint;
char* szPrint = bsPrint; Sleep(500);
m_szDisplay = "Succeed to Print";
HRESULT hr = CallPrintFunction(szPrint);
if ( FAILED(hr) )
{
m_szDisplay = "Failed to Print";
}
switch (lWait)
{
case 0:
CallJsFunction();
break;
case 1:
{
m_bCallJspFunc = TRUE;
Sleep(30);
} break;
default:
break;
}
return S_OK;
}
function TestCallBack() {
var obj = new ActiveXObject("CallBackForJs.JSCallBack.1");
var result = obj.Initialize();
result = obj.SetJsCallbackFunc(printMsg);
obj.Print("abc",1);
obj.UnInitialize();
}function printMsg(msg) {
alert(msg);
}
</script>
STDMETHODIMP CJSCallBack::Initialize(void)
{
// TODO: 在此添加实现代码
DWORD dThreadId;
m_hThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CallJspFunctionThread, this, 0, &dThreadId);
return S_OK;
}//线程函数
UINT CJSCallBack::CallJspFunctionThread(LPVOID param)
{
CJSCallBack* pCallBack = (CJSCallBack*)param; while(m_bRunThread)
{
while(m_bCallJspFunc)
{
pCallBack->CallJsFunction();
m_bCallJspFunc = FALSE;
} Sleep(1);
}
return 0;
}//设置回调函数
STDMETHODIMP CJSCallBack::SetJsCallbackFunc(VARIANT scriptCallback)
{
// TODO: 在此添加实现代码
if (scriptCallback.vt == VT_DISPATCH)
{
m_spCallback = scriptCallback.pdispVal;
} return S_OK;
}
//调用回调函数
void CJSCallBack::CallJsFunction()
{
CComVariant avarParams[1];
avarParams[0] = m_szDisplay; //指定回调函数的参数
DISPPARAMS params = { avarParams, NULL, 1, 0 };
if(m_spCallback)
{
HRESULT hr = m_spCallback->Invoke(0,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
¶ms, NULL, NULL, NULL);
}
}
//触发调用回调函数
STDMETHODIMP CJSCallBack::Print(BSTR bstrToPrint, LONG lWait)
{
// TODO: 在此添加实现代码
_bstr_t bsPrint = bstrToPrint;
char* szPrint = bsPrint; Sleep(500);
m_szDisplay = "Succeed to Print";
HRESULT hr = CallPrintFunction(szPrint);
if ( FAILED(hr) )
{
m_szDisplay = "Failed to Print";
}
switch (lWait)
{
case 0:
CallJsFunction();
break;
case 1:
{
m_bCallJspFunc = TRUE;
Sleep(30);
} break;
default:
break;
}
return S_OK;
}
function TestCallBack() {
var obj = new ActiveXObject("CallBackForJs.JSCallBack.1");
var result = obj.Initialize();
result = obj.SetJsCallbackFunc(printMsg);
obj.Print("abc",1);
obj.UnInitialize();
}function printMsg(msg) {
alert(msg);
}
</script>
解决方案 »
- 动态建立的一个table,点击ok按钮,显示ok按钮后面的文字,怎样实现?
- div.innerHTML += 'a';运行到这句就会报错,错误信息是:div is null
- 请教个动态生成td 的问题?
- 高分求助!!!ASP中如何识别某个程序是否正在运行?
- 鼠标点击的位置弹出div筐有脚本错误,大家帮看一下?
- 如何所选单选框的值~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 1个页面怎么取得前1个页面选择的RADIO的值?
- [端午节发分啦]只要您推荐1人并通过初试,奖励10分;推荐1人并被录取,奖励1000RMB
- 探讨一个“数据库连接”是否放在Session里的问题。。。。
- 正则表达式验证输入的用户名和密码
- 菜鸟问题:jquery无法设置checkbox选中
- 请问以下代码是怎么加密的?
最终在主线程中添加一个MsgWnd,将句柄传递给子线程,子线程在需要的时候,post或者sendmessage给MsgWnd,MsgWnd在调用主线程中的函数,实现了异步调用JS的回调函数