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 ...
随机推荐
- zoj Beautiful Number(打表)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2829 题目描述: Mike is very lucky, as ...
- [NOI 2016]循环之美
Description 题库链接 给出十进制下的 \(n,m,k\) ,求 \(\frac{i}{j},i\in[1,n],j\in[1,m]\) 在 \(k\) 进制下不同的纯循环小数个数. 纯循环 ...
- MVC应用程序显示上传的图片(续)
上一篇<MVC应用程序显示上传的图片>http://www.cnblogs.com/insus/p/3597543.html 最后有提及没有实现用户点击图片,显示原图的功能.此篇Insus ...
- tomcat内存设置问题
一. tomcat内存设置问题 收藏 在使用Java程序从数据库中查询大量的数据或是应用服务器(如tomcat.jboss,weblogic)加载jar包时会出现java.lang.OutOfMemo ...
- 【转】SAP HANA学习资料大全[非常完善的学习资料汇总]
Check out this SDN blog if you plan to write HANA Certification exam http://scn.sap.com/community/ha ...
- [android] 手机卫士号码归属地查询
使用小米号码归属地数据库,有两张表data1和data2 先查询data1表,把手机号码截取前7位 select outkey from data1 where id=”前七位手机号” 再查询data ...
- Java枚举的下标值
java中枚举值下标默认从0开始,可以用ordinal()这个方法获取下标值. public enum Sex { MALE(1,"男"),FEMALE(2,"女&quo ...
- Android-加载图片避免OOM
http://blog.csdn.net/guolin_blog/article/details/9316683 高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有 ...
- Java - "JUC" ReentrantReadWriteLock
Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock ReadWriteLock 和 ReentrantReadWriteLock介绍 ReadWriteLo ...
- RocketMQ 消息消费
消息消费 难点:如何保证消息只消费一次? 消费模式: 1.单一消费模式:一条消息,仅被一个消费者进行消费. 如何进行负载?负载算法有 a.平均分配.b.平均轮询分配.c.一致性hash(不推荐).d. ...