zoukankan      html  css  js  c++  java
  • AciveX接口事件的手动实现

    为了理解ActiveX事件的运作原理,特意做了如下实验

    初试化过程:

    try
    {
      CLSID clsid;
      HRESULT hr=::CLSIDFromProgID(L"MSWinsock.Winsock",&clsid);
      if(FAILED(hr))
       throw "获得对象的CLSID失败";
      hr=::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,__uuidof(IMSWinsockControl),(void**)&pMSWinsockControl);
      if(FAILED(hr))
       throw "创建对象失败...";
      hr=pMSWinsockControl->put_Protocol(sckUDPProtocol);
      if(FAILED(hr))
       throw "设置协议类型失败...";
    
      IConnectionPoint *cp=NULL;
      SinkDMSWinsockControlEvents * TheEventSink=NULL;
      IConnectionPointContainer *cps=NULL;
      hr=pMSWinsockControl->QueryInterface(IID_IConnectionPointContainer,(void**)&cps);
      if(FAILED(hr)) 
       throw "查询事件容器失败...";
      hr=cps->FindConnectionPoint(__uuidof(DMSWinsockControlEvents),&cp);
      if(FAILED(hr))
       throw "查找连接点失败...";
      cps->Release();
      hr=cp->Advise(&TheEventSink,&ConnectPointCookie);
      if(FAILED(hr))
       throw "连接连接点失败...";
      cp->Release();
    }
    catch(char* msg)
    {
      MessageBox(CString(msg));
      return S_FALSE;
    }
    return S_OK;
    }

    事件的实现类:

    class SinkDMSWinsockControlEvents : public IDispatch
    {
    。。。。。。
    //DISPID是一个长整数,它标识的是一个函数。对于IDispatch的某一个特定的实现,DISPID都是唯一的。IDispatch的每一个实现都有其自己的IID,这里dispidMemeber实际上是可以认为是和IE实例所发生的每一个事件相关的方法,比如:DISPID_BEFORENAVIGATE2,DISPID_NAVIGATECOMPLETE2
    STDMETHODIMP Invoke(
    DISPID dispID,
    REFIID riid, 
    LCID lcid, 
    WORD wFlags,
    DISPPARAMS * pdispparams,
    VARIANT * pvarResult,
    EXCEPINFO * pexcepinfo, 
    UINT * puArgErr)
    {
    int i;
    switch(dispID)
    {
    case 0:
      OnDataArrive(pdispparams->rgvarg->intVal);  
      break;
    default: break;
    }
    return S_OK;
    }
    void SinkDMSWinsockControlEvents::OnDataArrive(long bytesTotal)
    {
    VARIANT vtData;
    vtData.vt=VT_BSTR;
        vtData.bstrVal=CString("").AllocSysString();
        pMSWinsockControl->GetData(&vtData);
    CString str(vtData.bstrVal);
    pCommunucationCtrl->m_CurrentCommand=vtData.bstrVal;
    pCommunucationCtrl->Fire_OnCommandComming(vtData.bstrVal);
    }
    }


    看起来复杂的东西就是这样

  • 相关阅读:
    C#读写者线程(用AutoResetEvent实现同步)(转载)
    详解大端模式和小端模式(转载)
    C/C++程序员应聘试题剖析(转载)
    strcpy和memcpy的区别(转载)
    基于mini2440的Qt移植
    分布式服务以及跨平台开发清单(全栈之路)
    软件开发模式对比(瀑布、迭代、螺旋、敏捷)
    大数开方 ACM-ICPC 2018 焦作赛区网络预赛 J. Participate in E-sports
    啊啊
    括号问题
  • 原文地址:https://www.cnblogs.com/stst/p/4908947.html
Copyright © 2011-2022 走看看