zoukankan      html  css  js  c++  java
  • Dynamic Create COM Attribute

    Some time, we want our COM object will dynamic maintain it’s attribute, just like built-in COM object attribute. If we could do that ,we could add more attributes for COM object without  compile the souce code. It soud great.This COM object is very similiar with JavaScript object or other interpret lanuage object, for example: python.

    We know that when we use IDispatch interface to implement the COM object, we will get the automation of the object. Using IDispath interface, the COM object method and attribute could be get at running-time dynamicly. So if we have changed the default behaviour of the IDiaptch interface implement,  we could get the dynamic attribute.

    From aboving, we should change the action of the GetIDsOfNames and Invoke of the IDispatch interface, which may like that

    STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
    									LCID lcid, DISPID* rgdispid)
    	{
    		// first find from system IDL
    		HRESULT hr = CDispatchImpl::GetIDsOfNames( riid, rgszNames,
    								cNames, lcid, rgdispid);
    
    		if ( DISP_E_UNKNOWNNAME == hr )
    		{
    			hr = S_OK;
    			for (UINT i=0; i
    			{
    				if ( DISPID_UNKNOWN == rgdispid[i] )
    				{
    					// get the maintain dispid
    					rgdispid[i] = GetPropOrMethodDispid(rgszNames[i]);
    				}
    				else
    				{
    					hr = DISP_E_UNKNOWNNAME;
    				}
    			}
    		}
    		return hr;
    	}
    

    and change the Invoke function to :

    STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid,
    		LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
    		EXCEPINFO* pexcepinfo, UINT* puArgErr)
    	{
    		HRESULT hr = S_OK;
    		if ( IsDyanmicDispid(dispidMember) )
    		{
    			hr = InvokeDynamicPropOrMethod(dispidMember, riid,
    						lcid, wFlags, pdispparams, pvarResult,
    						pexcepinfo, puArgErr);
    		}
    		else
    		{
    			hr = CDispatchImpl::Invoke( dispidMember, riid, lcid, wFlags,
    							pdispparams, pvarResult, pexcepinfo, puArgErr);
    			if ( SUCCEEDED(hr) && pvarResult && VT_EMPTY == pvarResult->vt )
    			{
    
    				pvarResult->vt = VT_I4;
    				pvarResult->lVal = 0;
    			}
    			if ( FAILED(hr) && pvarResult && dispidMember >= 0 )
    			{
    				pvarResult->vt = VT_NULL;	// return null to show error;
    				hr = -hr;
    			}
    		}
    		return hr;
    	}
    

    We using GetPropOrMethodDispid and InvokeDynamicPropOrMethod function to resolve the dynamic attribute of COM object. Of course, we should use list or map to save the dispid, attribute name and attribute value in COM object, which will be used at used by Invoke interface function.

    from here you could download it :

    DynamicAttribute Code  // 在墙外,默认已经有了代理地址。

    实际地址为:

    http://www.qtrstudio.com/blog/wp-content/uploads/2010/10/DynamicAttribute.zip

    我的个人网站,就这么被墙了,郁闷!

    /*
    *
    * Copyright (c) 2011 Ubunoon.
    * All rights reserved.
    *
    * email: netubu#gmail.com replace '#' to '@'
    * http://www.cnblogs.com/ubunoon
    * 欢迎来邮件定制各类验证码识别,条码识别,图像处理等软件
    * 推荐不错的珍珠饰品,欢迎订购 * 宜臣珍珠(淡水好珍珠) */
  • 相关阅读:
    2021 RoboCom 世界机器人开发者大赛-本科组(初赛)7-1 懂的都懂 (20 分)
    PTA 乙级 1080 MOOC期终成绩 (25 分) C++
    PTA 乙级 1079 延迟的回文数 (20 分) C++
    PTA 乙级 1078 字符串压缩与解压 (20 分) C++
    PTA 乙级 1077 互评成绩计算 (20 分) C++
    PTA 乙级 1076 Wifi密码 (15 分) python
    PTA 乙级 1075 链表元素分类 (25 分) C++
    Hadoop 代码实现文件上传
    Django学习笔记十---FBV视图--003篇---获取请求信息
    Django学习笔记十---FBV视图--002篇---设置重定向和异常响应
  • 原文地址:https://www.cnblogs.com/ubunoon/p/COM_Dynamic_Attribute.html
Copyright © 2011-2022 走看看