首页 > 其他分享 >Opos扫码驱动开发

Opos扫码驱动开发

时间:2023-07-07 12:14:54浏览次数:53  
标签:扫码 exe ATL OPOSScanner ocx 调用 驱动 Opos

  记录一下Opos扫码驱动开发的过程,太少搞COM组件相关的了,很难查到相关材料,新手一开始很难。 

  Opos全称OLE for Retail POS,该标准使用组件对象模型,因此,支持COM控件的所有语言(即 Visual C++,Visual Basic和C#)可用于编写应用程序。就是按行业标准约定的接口,生成不同设备的控件。与扫码设备相关的控件为OPOSScanner.ocx。可以查找相关接口和开发文档进行应用软件开发。调用OPOSScanner.ocx的应用软件简称为exe,下载OPOSScanner.ocx在PC端注册后,使用约定的接口即可实现exe对OPOSScanner控件的调用,但是OPOSScanner接口关联的扫码设备的实际功能还需要开发一个组件支持,这里我用的是ATL,生成文件为DLL。同样的DLL也需要在PC端注册。这样,exe调用OPOSScanner的open标准接口,OPOSScanner的open标准接口再调用DLL的实际实现,达到打开扫码设备的功能。调用方式并非习惯的加载DLL后根据头文件使用接口函数,而是将ocx和atl在PC上注册到注册表,利用InvokeHelper或Invoke来查询组件的接口id。具体的技术细节不太懂,应该是基于跨语言的目的,生成的组件能在不同语言中调用,需要了解的可以去查查资料。

  应用软件的demo,可以参考OPOS-Scanner-and-Scale-Sample-App的SampleApp_OPOS_Scanner工程。改动SampleApp_OPOS_Scanner加载的ocx的GetClsid,加载目标ocx控件后,通过InvokeHelper函数调用标准接口。OPOSScanner.ocx的标准接口,查看github的OPOS-CCO工程ScannerImpl文件可知。在ocx内部,通过exe选择要加载的ATL名称,ocx在注册表中查询相关名称,再从子键找到CLSID,利用CLSID加载ATL DLL,Invoke调用ATL中实现功能的函数。OPOSScanner.ocx作为标准控件,不需要做任何修改。重点在ATL的驱动开发和exe的功能开发。

  ATL的开发就是Opos扫码设备的驱动,生成为DLL。需要结合OPOSScanner.ocx的标准接口内Invoke的调用,设定idl文件的接口id和接口参数,否则ocx无法顺利调用atl生成的组件。实现ATL后,exe调用ocx,ocx再调用atl,atl内部实现对扫码设备的控制就基本实现了。剩下还有一个难题,就是扫码设备是由ATL直接控制,扫码数据也是直接返回到ATL这一层,需要最终传回exe层显示。ATL无法直接调用ocx和exe的接口,而ocx是exe加载的,只能在exe调用ocx标准接口获取数据,ocx再调用ATL取得数据。因此,需要ATL在有数据的时候通知exe,再由exe调用去获取数据。但是如果在ATL触发事件,exe接收的话,就跳过了中间ocx标准控件,失去了按照标准接口使用,不需要针对单独ATL开发的意义。所以,实际是ATL通过postmessage通知ocx的窗口,ocx接收后触发消息FireEvent到exe,exe响应事件,再调用ocx标准接口获取数据。ocx作为中间的标准接口,上层的exe只要考虑相关接口和需要的功能,而ATL只要考虑和ocx的数据传递,不能直接和exe传输数据。

标签:扫码,exe,ATL,OPOSScanner,ocx,调用,驱动,Opos
From: https://www.cnblogs.com/linguinost/p/17534256.html

相关文章

  • 驱动开发:内核实现进程汇编与反汇编
    在笔者上一篇文章《驱动开发:内核MDL读写进程内存》简单介绍了如何通过MDL映射的方式实现进程读写操作,本章将通过如上案例实现远程进程反汇编功能,此类功能也是ARK工具中最常见的功能之一,通常此类功能的实现分为两部分,内核部分只负责读写字节集,应用层部分则配合反汇编引擎对字节集进......
  • 驱动开发:通过应用堆实现多次通信
    在前面的文章《驱动开发:运用MDL映射实现多次通信》LyShark教大家使用MDL的方式灵活的实现了内核态多次输出结构体的效果,但是此种方法并不推荐大家使用原因很简单首先内核空间比较宝贵,其次内核里面不能分配太大且每次传出的结构体最大不能超过1024个,而最终这些内存由于无法得到更好......
  • 驱动开发:摘除InlineHook内核钩子
    在笔者上一篇文章《驱动开发:内核层InlineHook挂钩函数》中介绍了通过替换函数头部代码的方式实现Hook挂钩,对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能,此类功能的实现一般可在应用层进行,而驱动层只需要保留一个读写字节的函数即可,将复杂的流程放在应用层实现是一......
  • 驱动开发:内核解析PE结构节表
    在笔者上一篇文章《驱动开发:内核解析PE结构导出表》介绍了如何解析内存导出表结构,本章将继续延申实现解析PE结构的PE头,PE节表等数据,总体而言内核中解析PE结构与应用层没什么不同,在上一篇文章中LyShark封装实现了KernelMapFile()内存映射函数,在之后的章节中这个函数会被多次用到,为了......
  • RV1126新增驱动IMX415 SENSOR,实现v4l2抓图
    RV1126新增驱动IMX415SENSOR,实现v4l2抓图。1:内核dts修改 &csi_dphy0{status="okay";ports{#address-cells=<1>;#size-cells=<0>;port@0{reg=<0>;#address-cells=<1>;#size-cells=<0>;mipi_in_ucam0:endpoint@1......
  • RV1126按键中断驱动和应用调试
     本人使用的调试平台是荣品的rv1126开发板,最近在调试按键中断。经过查看原理图,发现竟然没有一个空闲的IO,所以使用UART1的RX作为按键中断引脚。    驱动部分:     因为UART1原先已经在设备树中已经有了定义,需要将kernel/arch/arm/boot/dts/rongpin/rv1126_11......
  • t113-c-内核字符型设备驱动篇
    那么既然ko的驱动已经可以运行,那么我们来写几个简单的操作设备树的内核驱动字符型设备驱动和应用层这俩种代码是分开的,设备驱动调用的是内核的地址,而应用层则是相当于虚拟地址,所以应用层传递参数的时候不能直接付给指针,要调用相对于的参数内核->驱动->应用驱动的编写找到sdk......
  • 在linux开发板上加载.ko驱动文件时,出现“insmod: ERROR: could not insert module led
    本文档仅用于本人在学习过程中的记录,方便日后查找问题。问题描述:在ubuntu虚拟机编译出的xxx.ko文件,发送到linux开发板上,执行insmodxxx.ko时,出现“insmod:ERROR:couldnotinsertmoduleled.ko:Invalidmoduleformat”错误。原因查找:1)在linux开发板上,使用uname-r查看lin......
  • ubuntu20.04 卸载已有的显卡驱动,安装安装 NVIDIA 驱动程序 525.85.12(主要是搭建deepst
    nvidia安装deepstream官网:  https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Quickstart.html一、首先卸载本机的显卡驱动:参考连接(https://blog.csdn.net/gongdiwudu/article/details/128850792)1、卸载驱动库sudoapt-get--purgeremovenvidia*sudoapt......
  • 如何识别虚拟机上的显卡驱动程序
    在虚拟机/云环境中运行ENVI/IDL越来越受欢迎。确保虚拟机满足与台式机或笔记本电脑相同的硬件要求非常重要。在大多数情况下,在虚拟机环境中安装和运行ENVI的方法与台式机或笔记本电脑没有什么不同。然而,虚拟机缺少物理显卡并使用默认软件库的情况并不罕见。ENVI/IDL中的某些工具......