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 :
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);
}
}
看起来复杂的东西就是这样
AciveX接口事件的手动实现的更多相关文章
- yapi 事件创建、修改等接口事件监听
使用的yapi作为接口文档平台.出于业务需求需要对接口创建.修改.删除等事件进行监听. yapi已经实现并预留了这个口子,但是没有找到实现的文档.这里进行简单描述下使用的方式. 一.yapi创建.修改 ...
- API中FileReader 接口事件
FileReader 接口包含了一套完整的事件模型,用于捕获读取文件时的状态onabort 中断onerror 出错onloadstart 开始onprogress ...
- 微信公众平台设置URL和Token接收接口事件推送
最近做对接微信闪开发票-微信发票名片,里面有个接收用户提交抬头接口是微信推送事件到公众号后台,该事件将发送至开发者填写的URL(登录公众平台进入[开发者中心设置]). 开发者可通过事件推送完成数据统计 ...
- unity中 UGUI的按下、拖动接口事件的实现
using UnityEngine; using System.Collections.Generic; using DG.Tweening; using UnityEngine.EventSyste ...
- 了解IHttpModule接口事件执行顺便 获取Session
本文转载自:http://www.cnblogs.com/eflylab/archive/2008/05/29/1209767.html 最近公司一个项目让人SQL注入了-为了临时先解决这个问题,使攻 ...
- Java 基础 enum枚举类 的创建/使用/接口继承 ,以及手动创建枚举类的对象为:public static final
笔记: import java.lang.*; /**一:枚举类 : enum Season implements info { s1(),s2(),s3(),s4() }; //s1--s4 放在S ...
- 解决input 有多少个radio绑定change事件,手动触发就会执行多少次问题
如题,相信大家都会遇到这个问题,那么为什么会触发多次呢?其实当你用jquery绑定onchange事件的时候你就无形中给每个radio绑定了事件,所以才会出现执行多少次的问题了,那么如何解决呢,其实这 ...
- IHttpModule接口事件执行 获取Session 找了很多国内的都不对,从国外转过来一个测试可用的
我的环境,asp.net4.0框架集 不多说上代码 public class MyHttpModule : IHttpModule { public void Init(HttpApplication ...
- C#:实现接口中定义的事件
public delegate void TestDelegate(); // delegate declaration public interface ITestInterface { event ...
随机推荐
- Hbuider制作app升级包的简单办法 (升级官方提供的案例)
源文档:http://ask.dcloud.net.cn/question/11795 http://ask.dcloud.net.cn/article/199 一.生成移动App资源升级包 5+应用 ...
- C语言 两个小知识点
strlen 函数原型 extern unsigned int strlen(char *s); 在Visual C++ 6.0中,原型为size_t strlen(const char *strin ...
- vim 常用快捷键(整理版)
最常用: x 删除后面的字符 X 删除前一个字符 删除3个字符就是3x dd:删除一行 D 删除到行尾 J:删除换行符,使下一行并上来. nJ:连接后面的n行 u:撤销上一次操作 ...
- ACM-ICPC2018 沈阳赛区网络预赛-D-Made In Heaven8
A*算法: A*,启发式搜索,是一种较为有效的搜索方法. 我们在搜索的时候,很多时候在当前状态,已经不是最优解了,但是我们却继续求解:这个就是暴力搜索浪费时间的原因. 我们在有些时候,往往可以根据一些 ...
- .net core 中 identity server 4 之Server简单示例
Steps: 1.新建一个ASP.NET Core Web项目,SigmalHex.IdentityServer: 2.安装包 Install-Package IdentityServer4 3.St ...
- Docker 配置国内镜像拉取中心,Configure docker to use faster registries in China.
Networking in China is really bad when it comes to using some cloud based tools like docker, it's us ...
- 22、WebDriver
什么是WebDriver?1.Webdriver(Selenium2)是一种用于Web应用程序的自动测试工具:2.它提供了一套友好的API:3.Webdriver完全就是一套类库,不依赖任何测试框架, ...
- Vue.js 在 webpack 脚手架中使用 cssnext
Vue.js 的 webpack脚手架默认已经使用了 PostCSS 的 autoprefixer 的功能. 如果想使用下一代 css语法,即cssnext: 1. 安装依赖 npm install ...
- Git HTTPS 方式自动保存用户名密码
一行命令搞定: git config --global credential.helper wincred 第一次输入用户名和密码提交,第二次就不需要了 参考: https://help.github ...
- callee与caller
1.callee arguments.callee表示当前函数,使用于递归 function factorial(num){ if(num<=1){ return 1; }else{ retur ...