`
mengdejun
  • 浏览: 408840 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

COM 嵌套类实现COM

    博客分类:
  • Com
阅读更多
Ia.h
//#include <objbase.h>
//#include <unknwn.h>
interface IA:public IUnknown
{
	virtual int _stdcall Add(int a,int b)=0;
};
// {B7691C47-7C3A-419c-894D-9B428A92A0D8}
const IID IID_IA = 
{ 0xb7691c47, 0x7c3a, 0x419c, { 0x89, 0x4d, 0x9b, 0x42, 0x8a, 0x92, 0xa0, 0xd8 } };

 

Ib.h
//#include <objbase.h>
//#include <unknwn.h>
interface IB:public IUnknown
{
	virtual HRESULT _stdcall Pass(int a,int b,int* c)=0;
};
// {3C2BC1A6-6F46-4b09-8FAB-8A18C6F4FACA}
const IID IID_IB = 
{ 0x3c2bc1a6, 0x6f46, 0x4b09, { 0x8f, 0xab, 0x8a, 0x18, 0xc6, 0xf4, 0xfa, 0xca } };

 

Co.cpp
#include "ia.h"
#include "ib.h"
#include <atlbase.h>
class CO:public IUnknown
{
public:
	CO();
	HRESULT _stdcall QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
	ULONG _stdcall AddRef();
	ULONG _stdcall Release();
	class CA:public IA
	{
	public:
		CO* m_parent;
		HRESULT _stdcall QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
		ULONG _stdcall AddRef();
		ULONG _stdcall Release();
		int _stdcall Add(int a,int b);
	} ca;
	class CB:public IB
	{
	public:
		CO* m_parent;
		HRESULT _stdcall QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
		ULONG _stdcall AddRef();
		ULONG _stdcall Release();
		HRESULT _stdcall Pass(int a,int b,int* c);
	} cb;
private:
	long m_ref;
};
CO::CO()
{
	m_ref=0;
	ca.m_parent=this;
	cb.m_parent=this;
}
HRESULT _stdcall CO::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject)
{
	if(riid==IID_IA)
	{
		*ppvObject=(IA*)(&ca);
	}
	else if(riid==IID_IB)
	{
		*ppvObject=(IB*)(&cb);
	}
	else if(riid==IID_IUnknown)
	{
		*ppvObject=(IUnknown*)(this);
	}
	else
	{
		*ppvObject=NULL;
		return E_NOINTERFACE;
	}
	reinterpret_cast<IUnknown*>(*ppvObject)->AddRef();
	return S_OK;
}
ULONG _stdcall CO::AddRef()
{
	++m_ref;
	return m_ref;
}
ULONG _stdcall CO::Release()
{
	--m_ref;
	if(m_ref==0)
	{
		delete this;
		return 0;
	}
	return m_ref;
}
HRESULT _stdcall CO::CA::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject)
{
	return m_parent->QueryInterface(riid,ppvObject);
}
ULONG _stdcall CO::CA::AddRef()
{
	return m_parent->AddRef();
}
ULONG _stdcall CO::CA::Release()
{
	return m_parent->Release();
}
int _stdcall CO::CA::Add(int a,int b)
{
	int x=a+b;
	return x;
}
HRESULT _stdcall CO::CB::QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject)
{
	return m_parent->QueryInterface(riid,ppvObject);
}
ULONG _stdcall CO::CB::AddRef()
{
	return m_parent->AddRef();
}
ULONG _stdcall CO::CB::Release()
{
	return m_parent->Release();
}
HRESULT _stdcall CO::CB::Pass(int a,int b,int* c)
{
	int x=a-b;
	c=&x;
	return S_OK;
}
IUnknown* CreateInterface()
{
	IUnknown* pc=static_cast<IUnknown*>(new CO);
	return pc;
}

 

分享到:
评论

相关推荐

    c++嵌套类详细分析

    嵌套类可以在外围类的类体内定义,也可以在外围类的实现文件中定义。如果在外围类中定义嵌套类,那么嵌套类的成员函数可以在它的类体外定义。嵌套类中的成员函数可以访问外围类的成员,但外围类的成员不能访问嵌套类...

    Java 深入理解嵌套类和内部类

    Java 嵌套类和内部类详解 Java 中的嵌套类和内部类是指在一个类的内部定义另一个类,这种类称为嵌套类(nested classes)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,非静态嵌套类也即被称...

    嵌套类内存布局分析(vc)

    在C++中,嵌套类可以访问其外部类的所有成员,包括私有和保护成员,这为实现某些高级设计模式提供了便利。 内存布局方面,嵌套类的对象可能会存储在外部类对象的内存空间内,也可能是独立的。具体取决于编译器的...

    java-嵌套类(inner class)-来自oracle官网

    ### Java嵌套类详解 #### 一、嵌套类(Nested Class)概述 嵌套类是一种在Java中非常有用的特性,允许开发者在一个类或者接口的内部定义另一个类。这种结构可以增强代码的组织性和封装性。 ##### 1.1 嵌套类的...

    嵌套类的学习

    嵌套类是面向对象编程中的一个重要概念,它在Java、C#等编程语言中被广泛使用。嵌套类,顾名思义,就是在类内部定义的另一个类,它可以是静态的,也可以是非静态的,根据其特性,可以分为内部类(Inner Class)和...

    C++中的嵌套类参考

    在C++编程语言中,嵌套类是一种强大的特性,它允许在一个类的定义内部定义另一个类。...在实际编程中,嵌套类常用于实现复杂的面向对象设计,如工厂模式、策略模式等,以及处理需要紧密耦合的数据结构。

    java嵌套类

    匿名嵌套类在实现接口或者继承一个类时非常有用,尤其是在需要使用一次性的类时。匿名嵌套类通常用于实现事件监听器或者在创建线程时。 静态嵌套类(Static Nested Classes)和内部类(Inner Classes)是嵌套类的两...

    java和kotlin的内部类静态嵌套类

    在移动开发中,特别是Android应用开发,内部类和静态嵌套类经常用于实现回调、事件监听、以及封装与特定组件关联的行为。例如,你可以在一个Activity或Fragment中定义一个内部类来处理特定的点击事件,或者创建一个...

    C++ 嵌套类分配回收内存

    在C++中,嵌套类可以访问外部类的私有和保护成员,这为实现特定的功能提供了便利。然而,这也意味着在内存管理和生命周期控制上需要特别注意,因为不当的管理可能导致内存泄漏或资源浪费。 ### 示例分析:嵌套类的...

    HorizontalScrollView嵌套GridView实现水平滚动

    通过以上步骤,我们就成功地实现了HorizontalScrollView嵌套GridView,以及在选中item时联动ListView的变化。这种组合方式在需要展示大量横向分类数据,且每个分类下有详细列表的情况下非常有用。在实际项目中,可以...

    Fragment嵌套Fragment实现多tab页面

    "Fragment嵌套Fragment实现多tab页面"这个项目就是利用了这一特性来构建一个具有多个选项卡的应用。 在Android中,TabLayout通常与ViewPager结合使用来创建滑动选项卡,每个选项卡对应一个Fragment。Fragment嵌套则...

    android实现两层tab嵌套

    本示例实现的是一个更复杂的两层Tab嵌套功能,即在一级Tab之间切换时,每个一级Tab下还可能包含多个二级Tab。这种设计可以提供更丰富的用户体验,使用户能够更方便地在深度层次的导航结构中探索应用内容。 一、一级...

    java实现多层嵌套循环参数转换

    例如,如果有一个表示组织结构的类,其中包含子组织的列表,我们可以使用递归或嵌套循环来遍历整个结构: ```java public void traverseOrganization(Organization org) { // 处理当前组织 processOrganization...

    listview嵌套listview实现评论效果

    这就涉及到了ListView的嵌套使用,也就是一个ListView里面嵌套另一个ListView,来实现类似“评论列表”的效果。本教程将详细介绍如何在Android中使用ListView嵌套来构建这样的功能。 首先,我们要创建主ListView,...

    VC 实现函数嵌套的原理

    总的来说,VC++中的函数嵌套是通过编译器将嵌套函数转换为类成员实现的,这允许我们在MFC项目中利用函数嵌套来组织和优化代码。然而,使用这种特性时应保持代码的清晰度和可读性,避免滥用。通过理解函数嵌套的工作...

    java静态内部类(嵌套类)

    ### Java静态内部类(嵌套类)详解 #### 一、静态内部类概念与特性 在Java编程语言中,静态内部类(也被称为嵌套类)是一种特殊的内部类形式,它通过`static`关键字来定义。与普通内部类相比,静态内部类具有以下...

    嵌套滑动机制实现的联合fling滚动

    - `NestedScrollingChildHelper`和`NestedScrollingParentHelper`辅助类帮助实现嵌套滑动中的fling行为。 - `fling()`方法用于启动fling动画,根据速度和重力计算出滚动的距离。 - `computeScroll()`方法在View的...

    订单Listview嵌套的实现

    9. **内存管理**:注意内存泄漏问题,尤其是在持有对内外ListView引用的地方,例如匿名内部类的实现中。 10. **项目实践**:在"我的订单AS项目"中,你可以找到一个实际的案例,研究其代码结构、布局文件以及Adapter...

    C++嵌套类与局部类详细解析

    1. 嵌套类外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的...

Global site tag (gtag.js) - Google Analytics