第一篇技术类型博客,难免用词抑或技术细节存在的错漏。
项目整体采用flex作为前端显示,spring作为逻辑层,js调用ActiveX完成硬件操作。
至于数据库远程服务器负载均衡等核心技术,暂时不提。工作重点当然放在对硬件的封装:
首先理清关于底层的结构形成的结构是,dll作为sp封装底层设备类,正如我们所知,大部分设备采用串口与计算机通信,通过封装厂商指令,可以最底层的了解设备性能。但由于指令集复杂而且需要更多的时间。当然厂商通过封装指令集而产生API是最常用的。设备底层dll通常包含异步机制(即队列保存,线程遍寻)。
API层
ActiveX: cab 或者 ocx,
classid:作为web调用的唯一标识。返回值参数基本采用LONG和BSTR(字符类型是驱动开发过程为了满足各种语言调用时的一个重要设计条件,后面文章将仔细探讨)。
1 long COCXTEST_OCXCtrl::OpenComm() 2 { 3 // TODO: Add your dispatch handler code here 4 CString strPath;// = GetFilePath(); 5 strPath = "C:\\XFS\\OCXTEST\\OCXTEST_DLL.dll"; 6 hDll = LoadLibrary(strPath); 7 PrintLog(strPath); 8 lpOpenCom lpOpen; 9 if(hDll == NULL) 10 { 11 PrintLog("can't load the standard libaray"); 12 return 101; //动态库为空 13 } 14 else 15 { 16 lpOpen = (lpOpenCom)GetProcAddress(hDll,"Open"); 17 } 18 if(lpOpen == NULL) 19 { 20 return 102; //函数为空 21 } 22 if(0==lpOpen()) 23 { 24 return 0; 25 } 26 return 1; 27 }
其中采用隐式调用的dll就是下面spi层的结果。
SPI层
Dll: lower layer层相对ocx更底层,主要封装基于Cen/xfs,或者范wosa规范的硬件(标准wosa规范下的代码将在后续文章中标注)
版本号,在vc工程中insert—>resources->versions作为驱动的唯一标识需要详细标识。
调用路径:这是dll,multi——layer常见的,显示loadlibaray
先使用最简单的结构源代码,以展示上述问题。
extern "C" OCXTEST_DLL_API int Open(void) { return 0; } // This is the constructor of a class that has been exported. // see OCXTEST_DLL.h for the class definition COCXTEST_DLL::COCXTEST_DLL() { return; }
Web层
javascript直接调用,关于响应事件及特殊参数的调用后续。
<body> <OBJECT ID="ocx" CLASSID="CLSID:441FEC3E-02DD-4AEE-9A2C-5DCBE7CC788F" width='370' height='200' codebase='OCXTEST_OCX.ocx'> </OBJECT> <script language="javascript"> Play(); function Play() { var gg=document.getElementById("ocx"); var a=gg.OpenComm(); var retval; alert(a); //alert(retval); gg.Excute(1); } function ExcuteJS() { var obj = document.getElementById("ocx"); obj.Excute(1); } </script>
下篇将对API层进行稍微深入的封装并针对ActiveX中BSTR展开探讨字符类型。