zoukankan      html  css  js  c++  java
  • Qt Zebra扫码枪的命令发送和接收com组件的事件

    如题,zebra官网给出的扫码枪SDK示例是基于MFC的,自己用的是QT,加大了开发难度(悔不当初用MFC),同时也对com组件不熟悉,导致折腾了好几天才搞定。也不知道这么做能不能满足QT跨平台的初衷,Windows是能用的,给大家参考一下。

    1、下面是代码,命令发送这部分很容易解决,稍微改下就行,主要是接收com组件的事件,我这边采用了回调函数的方式接收信息。

     1 private:
     2     DWORD m_dwRefCount;
     3     Callback  //自己定义的回调函数
     4     void * user;
     5 public:    
     6     void SetCallbackFunc(CallbackGetScannerData cbk, void* user)
     7     {
     8         this->cbkGetData = cbk;
     9         this->user = user;
    10     }
    11     
    12     CEventSink() { m_dwRefCount = 0; }
    13     virtual ~CEventSink(void) {}
    14     
    15     STDMETHODIMP GetTypeInfoCount(UINT *pctinfo) { return E_NOTIMPL; }
    16     STDMETHODIMP GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { return E_NOTIMPL; }
    17     STDMETHODIMP GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { return E_NOTIMPL; }
    18     
    19     STDMETHODIMP Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
    20     {
    21         LONG *lValue = pVarResult->plVal;
    22         switch (dispIdMember)
    23         {
    24         case 3:      //能获取到扫描枪扫的条码信息
    25         {
    26             VARIANT varlValue;
    27             VARIANT varlValue1;
    28             short lValue = 0;
    29             BSTR lValue1;
    30             varlValue = (pDispParams->rgvarg)[1];
    31             varlValue1 = (pDispParams->rgvarg)[0];
    32             //varlValue1.pbstrVal
    33             lValue = V_I2(&varlValue);
    34             lValue1 = SysAllocString(*(varlValue1.pbstrVal));
    35             if(cbkGetData)
    36                 //放自己定义的回调函数
    37             break;
    38         }
    39         default:
    40             break;
    41         }
    42         //printf(" ---------the result %d
    ", *lValue);
    43         //OnReceiver(lValue);
    44         return S_OK;
    45     }
    46     STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppv)
    47     {
    48         if ((iid == __uuidof(_ICoreScannerEvents)) || //(iid == __uuidof(IMarshal)) ||
    49             (iid == __uuidof(IDispatch)) ||
    50             (iid == __uuidof(IUnknown)))
    51         {
    52             m_dwRefCount++;
    53             *ppv = this;
    54         }
    55         else
    56         {
    57             *ppv = NULL;
    58             return E_NOINTERFACE;
    59         }
    60         return S_OK;
    61     }
    62     STDMETHOD_(ULONG, AddRef)()
    63     {
    64         return InterlockedIncrement(&m_dwRefCount);
    65     }
    66     STDMETHOD_(ULONG, Release)()
    67     {
    68         InterlockedDecrement(&m_dwRefCount);
    69         if (m_dwRefCount != 0)
    70             return m_dwRefCount;
    71         delete this;
    72         return 0;
    73     }
    74 };

    2、下面是调用的这个类的代码

     1  if(ScannerInterface)
     2     {
     3         HRESULT hr = S_FALSE;
     4         //Create the Scanner COM object
     5         IConnectionPointContainer *pCPC;
     6         hr = ScannerInterface->QueryInterface(IID_IConnectionPointContainer, (void **)&pCPC);
     7         if (!SUCCEEDED(hr))
     8         {
     9             return -1;
    10         }
    11 
    12         //获取连接点
    13         hr = pCPC->FindConnectionPoint(DIID__ICoreScannerEvents, &pCP);
    14         if (!SUCCEEDED(hr))
    15         {
    16             return -1;
    17         }
    18         pCPC->Release();
    19 
    20         IUnknown *pSinkUnk;
    21         ScannerEventSink = new CEventSink();
    22         ScannerEventSink->SetCallbackFunc(//自定义的回调函数, user);
    23 
    24         hr = ScannerEventSink->QueryInterface(DIID__ICoreScannerEvents, (void **)&pSinkUnk);
    25         hr = pCP->Advise(pSinkUnk, &dwAdvise);//注册其接收接口指针
    26         if (!SUCCEEDED(hr))
    27         {
    28             return -1;
    29         }
    30     }
  • 相关阅读:
    Java微信分享接口开发
    lintcode 刷题 by python 部分链表题总结(2)
    基于CART的回归和分类任务
    机器学习: K-means 聚类
    python 中的堆 (heapq 模块)应用:Merge K Sorted Lists
    名人、皇家谱系
    python实现数组和链表的归并排序
    Python 正则 —— 捕获与分组
    ArcGIS中的数据连接问题——数据类型不统一
    Spring boot 搭建
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/15137734.html
Copyright © 2011-2022 走看看