博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++代码中回调JS方法
阅读量:4704 次
发布时间:2019-06-10

本文共 1829 字,大约阅读时间需要 6 分钟。

前段时间开发了一个COM组件配合web前端使用,遇到了C++中调用JS代码的问题,在网上查了很多资料,现总结一下,留作以后察看。

C++中调用JS代码主要有两种情况:1. IE线程中调用;2. 其他线程调用

1. IE线程中调用:这种情况网上已经有很多资料,下面列出示列代码:

C++代码

STDMETHODIMP CJsInvoker::InvokeJsFunc(LONG para1, LONG para2, VARIANT jsFunction, LONG* retValue){    CComPtr
jsCallback; if (jsFunction.vt == VT_DISPATCH) jsCallback = jsFunction.pdispVal; VARIANT arg[2]; arg[0].vt = VT_I4; arg[1].vt = VT_I4; arg[0].lVal = para1; arg[1].lVal = para2; VARIANT pvarRet; jsCallback.InvokeN(static_cast
(DISPID_VALUE), arg, 2, &pvarRet); *retValue = pvarRet.lVal; return S_OK;}

 

 JS代码 

 

从代码中可以看出,Js方法作为IDispatch指针传入COM,C++通过调用其InvokeN方法实现。

2. 其他线程调用:与IE线程直接调用的区别在于需要列集与反列集,原因是JS代码是运行在自己的套间线程里的,其他线程是不能直接访问的,只能通过代理进入消息循环中。

C++代码

STDMETHODIMP CJsInvoker::InvokeJsFunc3(LONG para1, LONG para2, VARIANT jsFunction, LONG* retValue){    // Check whether is valid Dispatch interface.    if (V_VT(&jsFunction) != VT_DISPATCH || jsFunction.pdispVal == NULL) {        return E_INVALIDARG;    }    // 对IDispatch指针列集    CoMarshalInterThreadInterfaceInStream(IID_IDispatch, jsFunction.pdispVal, &m_stream_jsfunc);    m_hTread = CreateThread(NULL, 0, ThreadFunction, this, NULL, NULL);    return S_OK;}DWORD WINAPI ThreadFunction(LPVOID pParam){    ::CoInitialize(NULL);    CJsInvoker* pJsInvoker = (CJsInvoker*)pParam;    CComPtr
script; // 反列集得到IDisPatch指针 CoGetInterfaceAndReleaseStream(pJsInvoker->m_stream_jsfunc, IID_IDispatch, (LPVOID *)&script); VARIANT arg[2]; arg[0].vt = VT_I4; arg[1].vt = VT_I4; arg[0].lVal = 1; arg[1].lVal = 2; VARIANT pvarRet; script.InvokeN(static_cast
(DISPID_VALUE), arg, 2, &pvarRet); ::CoUninitialize(); return S_OK;}

 

 JS代码

 

转载于:https://www.cnblogs.com/wadexia/p/COM-JS.html

你可能感兴趣的文章
【转】IT名企面试:微软笔试题(1)
查看>>
IO流入门-第十章-DataInputStream_DataOutputStream
查看>>
DRF的分页
查看>>
Mysql 模糊匹配(字符串str中是否包含子字符串substr)
查看>>
python:open/文件操作
查看>>
流程控制 Day06
查看>>
Linux下安装Tomcat
查看>>
windows live writer 2012 0x80070643
查看>>
tomcat 和MySQL的安装
查看>>
git常用操作
查看>>
京东SSO单点登陆实现分析
查看>>
u-boot启动第一阶段
查看>>
MySQL批量SQL插入性能优化
查看>>
定义列属性:null,default,PK,auto_increment
查看>>
用户画像展示
查看>>
C#中StreamReader读取中文出现乱码
查看>>
使用BufferedReader的时候出现的问题
查看>>
批处理文件中的路径问题
查看>>
hibernate出现No row with the given identifier exists问题
查看>>
为什么wait()和notify()属于Object类
查看>>