COM动态添加删除成员,类似JavaScript中调用的对象
在JavaScript中调用对象时,可动态添加删除成员如:
var obj=new Object;
obj.member1='aaaaa';
obj.fun1=function()
{
alert('fun1');
}
JS在调用对象成员之前,先利用IDispatchEx::GetDispID(成员名) 判断成员是否存在
那么在VC++中编写COM对象时即可以这样 在GetDispID中 添加对应的成员即可
//类头文件
class CSRObject :public IDispatchEx
{
CSRObject(void);
~CSRObject(void);
virtual HRESULT STDMETHODCALLTYPE GetDispID( __RPC__in BSTR bstrName, DWORD grfdex, __RPC__out DISPID *pid ); virtual HRESULT STDMETHODCALLTYPE InvokeEx( DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller ); virtual HRESULT STDMETHODCALLTYPE DeleteMemberByName( __RPC__in BSTR bstrName, DWORD grfdex );
virtual HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid, void **ppvObject );
//省略若干虚函数实现...
}
HRESULT STDMETHODCALLTYPE CSRObject::QueryInterface( REFIID riid, void **ppvObject )
{
if (riid==IID_IUnknown)
{
*ppvObject = (CSRObject *)this;
}else if (riid==IID_IDispatch)
{
*ppvObject = (CSRObject *)this;
}else if (riid==IID_IDispatchEx)
{
*ppvObject = (CSRObject *)this;
//IDispatchEx接口
}else{
*ppvObject = NULL;
return(E_NOINTERFACE);
}
return S_OK;
} //这里是JS按照成员名字查成员DISPID
//JS在调用成员前会先调用该函数
HRESULT STDMETHODCALLTYPE CSRObject::GetDispID( __RPC__in BSTR bstrName, DWORD grfdex, __RPC__out DISPID *pid )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); if(grfdex & fdexNameCaseInsensitive)
//如果有fdexNameCaseInsensitive标志,查找成员名时忽略大小写 if (成员不存在 && grfdex & fdexNameEnsure)
//如果成员不存在且有fdexNameEnsure标志,你需要动态的创建这个成员名
//存在成员返回S_OK,并且 *pid=该成员ID
//没有该成员返回 DISP_E_UNKNOWNNAME
}
//这里才是真正的调用函数
HRESULT STDMETHODCALLTYPE CSRObject::InvokeEx( DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller )
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
//参数:id 就是JS通过GetDispID得到的DISPID,你需要按照该ID判断此次调用的是什么函数
if (wFlags & DISPATCH_PROPERTYGET && wFlags & DISPATCH_METHOD)
{
//比如在JS中的代码:
//var n=xxx.getvalue([param]);
//那么将会到这里来
}else if (wFlags & DISPATCH_PROPERTYGET) //获取属性值
{
//比如在JS中的代码:
//var n=xxx.value;
//那么将会到这里来
}else if (wFlags & DISPATCH_PROPERTYPUT) //设置属性值
{
//比如在JS中的代码:
//xxx.value=n;
//那么将会到这里来
}else if (wFlags & DISPATCH_METHOD) //调用成员
{
//比如在JS中的代码:
//xxx.getvalue();
//那么将会到这里来
}else{
//其它情况暂时没遇到过
return DISP_E_MEMBERNOTFOUND;
}
return hr;
}
COM动态添加删除成员,类似JavaScript中调用的对象的更多相关文章
- JAVAFX 2.0 javascript中调用java代码
现在你已经知道如何在JavaFX中调用JavaScript.在本章中,你将了解到相反的功能——在web页面中调用JavaFX. 大体上的理念是在JavaFX程序中创建一个接口对象,并通过调用JSObj ...
- 使用Ajax在javascript中调用后台C#函数
使用Ajax在javascript中调用后台C#函数 最近一段时间在紧跟一个网站的项目,数据库中用户表的UserName要求是唯一的,所以当用户选定一个用户名进行注册时要首先检查该用户名是否已被占用, ...
- 将HTML字符转换为DOM节点并动态添加到文档中
将HTML字符转换为DOM节点并动态添加到文档中 将字符串动态转换为DOM节点,在开发中经常遇到,尤其在模板引擎中更是不可或缺的技术. 字符串转换为DOM节点本身并不难,本篇文章主要涉及两个主题: 1 ...
- JavaScript中的事件对象
JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...
- 详解javascript中的this对象
详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的 ...
- JavaScript中创建字典对象(dictionary)实例
这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象 ...
- Javascript学习1 - Javascript中的类型对象
原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...
- 简单使用JSON,JavaScript中创建 JSON 对象(一)
JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...
- javascript中如何获取对象名
javascript中如何获取对象名 一.总结 一句话总结:将对象传入参数,看参数是否为函数(js中的对象和函数是一个意思么(函数肯定是对象)),对象参数.name属性即可获得 //版本4 funct ...
随机推荐
- C#Redis 常用key操作
一.前戏 在该系列的前几篇博客中,主要讲述的是与Redis数据类型相关的命令,如String.List.Set.Hashes和Sorted-Set.这些命令都具有一个共同点,即所有的操作都是针对与Ke ...
- 并发编程之 Fork-Join 分而治之框架
前言 "分而治之" 一直是一个有效的处理大量数据的方法.著名的 MapReduce 也是采取了分而治之的思想.简单来说,就是如果你要处理1000个数据,但是你并不具备处理1000个 ...
- .1-浅析express源码之入口文件
鸽了鸽了,webpack源码大垃圾,看了那么久,感觉自己越来越渣……还是换个口味,node了解一下? 尝试从express框架源码入手,学习一下node的http模块相关的知识. 入口文件 先从框架的 ...
- 记录数据库操作记录的DDL触发器
我们在项目中经常会对数据做一些操作,比如增加一个字段,修改一个存储过程,删除表等等操作,很有必要记录这些操作,以便以后出了问题,方便找到元凶.接下来介绍一个DDL触发器在实际环境中的使用,这个DDL触 ...
- 【转】Java工程师成神之路
针对本文,博主最近在写<成神之路系列文章> ,分章分节介绍所有知识点.欢迎关注. 一.基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 h ...
- [javascript] 看知乎学习js事件触发过程
红色箭头代表捕获阶段 蓝色代表目标阶段 绿色代表冒泡阶段 调用元素对象的addEventListener()方法,参数:事件,回调函数,是否捕获(true代表捕获阶段,false代表冒泡阶段,ie浏览 ...
- Springmvx拦截html出现406解决以及Server Tomcat v8.0 Server at localhost failed to start 问题解决方法
问题是这样的:环境是SSM框架,在配置好的框架里想请求一个html,结果406了,406就是HTTP协议状态码的一种,表示无法使用请求的特性来响应请求的网页.一般指客户端浏览器不接受所请求页面的MIM ...
- Dubbox分布式框架
一:简介:前身是阿里巴巴的一个开源的项目,后来停止维护,由当当网继续维护,它致力于rpc远程的调度方案.是一个服务框架 二:执行原理图: 节点角色说明: · Provider: 暴露服务的服务提供方. ...
- Mybatis标签bind用法
Mybatis使用bind元素进行模糊查询,不用在乎数据库是mysql还是oracle从而提高可移植性 使用bind元素传递多个参数 public List<Student> findSt ...
- Python 调度算法 死锁 静动态链接 分页分段
1 select poll epoll的区别基本上select有3个缺点: 连接数受限查找配对速度慢数据由内核拷贝到用户态poll改善了第一个缺点 epoll改了三个缺点. (1)select,pol ...