87,991
社区成员
发帖
与我相关
我的任务
分享
//初始化创建线程
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>