在JavaScript中调用对象时,可动态添加删除成员如:

var obj=new Object;
obj.member1='aaaaa';
obj.fun1=function()
{
alert('fun1');
}
查了好些资料,原来Object这个COM对象,是实现了IDispatchEx接口

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;
}

备份:http://www.silenceret.com/view.asp?id=12

COM动态添加删除成员,类似JavaScript中调用的对象的更多相关文章

  1. JAVAFX 2.0 javascript中调用java代码

    现在你已经知道如何在JavaFX中调用JavaScript.在本章中,你将了解到相反的功能——在web页面中调用JavaFX. 大体上的理念是在JavaFX程序中创建一个接口对象,并通过调用JSObj ...

  2. 使用Ajax在javascript中调用后台C#函数

    使用Ajax在javascript中调用后台C#函数 最近一段时间在紧跟一个网站的项目,数据库中用户表的UserName要求是唯一的,所以当用户选定一个用户名进行注册时要首先检查该用户名是否已被占用, ...

  3. 将HTML字符转换为DOM节点并动态添加到文档中

    将HTML字符转换为DOM节点并动态添加到文档中 将字符串动态转换为DOM节点,在开发中经常遇到,尤其在模板引擎中更是不可或缺的技术. 字符串转换为DOM节点本身并不难,本篇文章主要涉及两个主题: 1 ...

  4. JavaScript中的事件对象

    JavaScript中的事件对象 JavaScript中的事件对象是非常重要的,恐怕是我们在项目中使用的最多的了.在触发DOM上的某个事件时,会产生一个事件对象event,这个对象中包含这所有与事件有 ...

  5. 详解javascript中的this对象

    详解javascript中的this对象 前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象.Javascript可以通过一定的 ...

  6. JavaScript中创建字典对象(dictionary)实例

    这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象 ...

  7. Javascript学习1 - Javascript中的类型对象

    原文:Javascript学习1 - Javascript中的类型对象 1.1关于Numbers对象. 常用的方法:number.toString() 不用具体介绍,把数字转换为字符串,相应的还有一个 ...

  8. 简单使用JSON,JavaScript中创建 JSON 对象(一)

    JSON:JavaScript 对象表示法(JavaScript Object Notation). JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML 更小.更快,更易解析. ...

  9. javascript中如何获取对象名

    javascript中如何获取对象名 一.总结 一句话总结:将对象传入参数,看参数是否为函数(js中的对象和函数是一个意思么(函数肯定是对象)),对象参数.name属性即可获得 //版本4 funct ...

随机推荐

  1. Centos7 安装字体库&中文字体

    1.概述 在安装一些服务的时候,会涉及到字符编码与字体的问题,字符编码一般在数据库或代码级别设置,字体一般是在系统级别设置.如安装使用jira或confluence的时候,使用一些宏的时候经常会出现乱 ...

  2. postgreSql 常用查询总结

    1. 日期格式转化(参考) select beg_time, end_time, extract(epoch from to_timestamp(end_time,'yyyy-mm-dd-HH24-M ...

  3. Spring中使用变量${}的方式进行参数配置

    在使用Spring时,有些情况下,在配置文件中,需要使用变量的方式来配置bean相关属性信息,比如下面的数据库的连接使用了${}的方式进行配置,如下所示: <bean id="data ...

  4. 关于Markdown插入图片路径错误的问题

    关于Markdown插入图片路径错误的问题 开发问题 解决方法  妈耶,连续一天写2篇博客,也是醉了,这篇博客主要是介绍关于Markdown插入图片路径错误的问题 在上篇中,我介绍了一下Markdow ...

  5. [转]论magento1和magento2的速度性能优化问题

    本文转自:http://www.360magento.com/blog/magento-speed-up/ magento从2007年发展至今,也经历了十余年的磨练,如今也迎来了magento的换代产 ...

  6. 配置Windows 防火墙,允许SQL Server的远程连接

    在运行SQL Server的服务器上,我们要找到哪些是SQL Server正在侦听的端口,并将其添加到Windows防火墙的入站例外. 首先,我们需要添加 SQL Server 服务侦听 Window ...

  7. Book Contents Reviews Notes Errata Articles Talks Downloads Resources Code Formatter Cover of C# in Depth Order now (3rd edition) Implementing the Singleton Pattern in C#

    原文链接地址: http://csharpindepth.com/Articles/General/Singleton.aspx#unsafe Implementing the Singleton P ...

  8. SpringCloud高可用和高并发

    1 高可用 什么是高可用:(High Availability)在一个长时间内服务不受影响.通俗的讲就是,一个机器挂掉的时候,有其他机器可以继续提供同样的服务. 如何实现高可用:冗余+自动故障转移.冗 ...

  9. 深入浅出Mybatis技术原理与实战(杨开振)(带详细书签) PDF 下载 高清 完整版+源码

    (杨开振) 源码 IDE eclipse 建表语句也在里面 电子书+源码地址

  10. PHP中按值传递和引用传递的区别

    有次跟朋友讨论对象传值的方式时提到引用传值时,在大脑中搜索五秒钟,果断确定在这两个项目当中并没有用到.今天去问了一下度娘,顺便做了个小测试: 按值传递: 引用传递: 按值传递中原来参数的值在调用其他函 ...