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 ...
随机推荐
- 【Vue】v-if与v-show的区别
相同点:v-if与v-show都可以动态控制dom元素显示隐藏 不同点:v-if显示隐藏是将dom元素整个添加或删除,而v-show隐藏则是为该元素添加css--display:none,dom元素还 ...
- #if defined 和 #if ! defined 的用法
背景:MFC初学,头文件中有#if !defined(AFX_HELLOMFC_H__706D36F5_2F1B_40AC_8BE9_0BD6A1D7BBDE__INCLUDED_)#define A ...
- Fork/Join 框架-设计与实现(翻译自论文《A Java Fork/Join Framework》原作者 Doug Lea)
作者简介 Dong Lea任职于纽约州立大学奥斯威戈分校(State University of New York at Oswego),他发布了第一个广泛使用的java collections框架实 ...
- 批量导出VBA工程中的Source
在做Excel宏相关项目的开发和维护过程中,我们经常需要导出VBA中的Source,但是Excel提供的宏编辑器中只能一个文件一个文件地导出,很不方便. 下面介绍2种批量导出的方法: 1.Source ...
- Java多线程——之一创建线程的四种方法
1.实现Runnable接口,重载run(),无返回值 package thread; public class ThreadRunnable implements Runnable { public ...
- Hibernate中的事务隔离问题(脏读、不可重复读、幻读)
Hibernate中的事务隔离问题(脏读.不可重复读.幻读) 1.事务的特性 事务的四个特性: 1)原子性:事务是进行数据库操作的最小单位,所以组成事务的各种操作是不可分割的 2)一致性:组成事务的各 ...
- 关于如何在本地IIS搭建网站
步骤一: 首先安装与配置IIS服务,可借用百度经验:http://jingyan.baidu.com/article/d5a880eb75f74713f047cc57.html 步骤二: 修改web. ...
- POJ3261(SummerTrainingDay10-G 后缀数组)
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 15974 Accepted: 7041 Ca ...
- WebForms开发方式以及优缺点,来源《ASP.NET MVC企业级实战》
WebForms有以下3种开发方式 1.服务器端控件 2.一般处理程序+HTML静态页+Ajax 3.一般处理程序+HTML模板 WebForms的请求的是具体的某一个文件.具体的一个类,由客户端发送 ...
- CentOS 修改用户密码
CentOS 修改用户密码 1.普通用户 ①获取超级用户root权限 命令:su 或者 su- 或者 su -root ②输入命令: passwd 用户名 ③输入新密码 2.超级用户 ①打开syste ...