最近项目大致内容是用网页查看摄像头,将摄像头SDK封装ocx控件并打包就不概述了,网页加载ocx控件也不概述了。
今天遇到的主要问题就是,JS调用ocx中的函数并传参的问题,本人也是初次接触MFC,JS更是一窍不通,这次的问题网上雷同的帖子很多,但是能解决问题的比较少,我解决问题后也没有继续深入研究,只是写出来提供一下思路,欢迎交流。
首先问题分两部分:
1 是MFC对外接口函数的定义,并不是所有的函数都可以供对外调用。
2 是参数类型的问题。
首先看第一个问题,ocx提供的对外接口,要定义调度映射和事件映射方法,参考了这个帖子链接,写的比较详细,巧的是这个帖子并没有写带参数的。
然后是第二个问题,以我这次做的程序为例,ocx内C++的函数需要的参数是char*, 看了很多帖子都说js直接传字符串就可以,比如 var hehe = "xxxx";
但是实际上由于js 与C++数据类型的不一样,我一开始写的传进来的参数直接用是不行的
网页代码
<body>
<object id="objec" name="axSAM" classid="clsid:746A1AC7-75EA-4D50-8262-380CDFCB7AD2" style="height:500px;width:1000px;border:1px solid #000;" ></object>
</body>
<script>
alert("1111111111111111111");
var obj = document.getElementById("objec");
var aa = "at.0cjb8uw662r2be7sd0s2tqpqbeev89fy-8kwwylqv6n-1t8tzmo-zodxnxgl8";
var bb = "640033347";
obj.VideoStart(aa ,bb );
alert("22222222222222222222");
</script>
MFC ActiveX代码
LONG ChomevideoCtrl::VideoStart(CHAR * accessToken, CHAR * deviceSerial)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
YSY_SDK_Init(accessToken,deviceSerial);
return 0;
}
后来意识到数据类型出了问题,查资料的时候查到了_bstr_t,头文件comdef.h,具体的我就不细说,有很多帖子资料。
我的理解就是,不同语言对数据类型的处理不太一样,尤其是不同语言中char、String这些字符、字符串等涉及到内存和大小的数据类型。这时候就需要有个统一的类库进行数据转换处理防止出错。
所以再回到第一个问题,进行ocx控件对外接口创建的时候,参数类型就要选对应的,以我的程序字符串为例,就要选BSTR了,如图
然后代码中用 _bstr_t 对传进来的参数进行处理,再给C++的函数使用,如下面的代码:
void ChomevideoCtrl::VideoStart(LPCTSTR accessToken, LPCTSTR deviceSerial)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
_bstr_t a = accessToken;
_bstr_t b = deviceSerial;
YSY_SDK_Init(a,b);
// TODO: 在此添加调度处理程序代码
}
然后就可以运行了
就此实现了MFC ActiveX 封装摄像头的dll库 生成ocx,然后网页进行调用。
过程写的比较随意,解决了我的问题以后没有再研究其他的数据类型,只是分享一下思路以供参考