网页 Java script 调用MFC ActiveX ocx控件的函数并传参数给函数

    xiaoxiao2021-12-14  23

    最近项目大致内容是用网页查看摄像头,将摄像头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,然后网页进行调用。

    过程写的比较随意,解决了我的问题以后没有再研究其他的数据类型,只是分享一下思路以供参考

    转载请注明原文地址: https://ju.6miu.com/read-969743.html

    最新回复(0)