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;
}
分享到:
相关推荐
嵌套类可以在外围类的类体内定义,也可以在外围类的实现文件中定义。如果在外围类中定义嵌套类,那么嵌套类的成员函数可以在它的类体外定义。嵌套类中的成员函数可以访问外围类的成员,但外围类的成员不能访问嵌套类...
Java 嵌套类和内部类详解 Java 中的嵌套类和内部类是指在一个类的内部定义另一个类,这种类称为嵌套类(nested classes)。嵌套类有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,非静态嵌套类也即被称...
在C++中,嵌套类可以访问其外部类的所有成员,包括私有和保护成员,这为实现某些高级设计模式提供了便利。 内存布局方面,嵌套类的对象可能会存储在外部类对象的内存空间内,也可能是独立的。具体取决于编译器的...
### Java嵌套类详解 #### 一、嵌套类(Nested Class)概述 嵌套类是一种在Java中非常有用的特性,允许开发者在一个类或者接口的内部定义另一个类。这种结构可以增强代码的组织性和封装性。 ##### 1.1 嵌套类的...
嵌套类是面向对象编程中的一个重要概念,它在Java、C#等编程语言中被广泛使用。嵌套类,顾名思义,就是在类内部定义的另一个类,它可以是静态的,也可以是非静态的,根据其特性,可以分为内部类(Inner Class)和...
在C++编程语言中,嵌套类是一种强大的特性,它允许在一个类的定义内部定义另一个类。...在实际编程中,嵌套类常用于实现复杂的面向对象设计,如工厂模式、策略模式等,以及处理需要紧密耦合的数据结构。
匿名嵌套类在实现接口或者继承一个类时非常有用,尤其是在需要使用一次性的类时。匿名嵌套类通常用于实现事件监听器或者在创建线程时。 静态嵌套类(Static Nested Classes)和内部类(Inner Classes)是嵌套类的两...
在移动开发中,特别是Android应用开发,内部类和静态嵌套类经常用于实现回调、事件监听、以及封装与特定组件关联的行为。例如,你可以在一个Activity或Fragment中定义一个内部类来处理特定的点击事件,或者创建一个...
在C++中,嵌套类可以访问外部类的私有和保护成员,这为实现特定的功能提供了便利。然而,这也意味着在内存管理和生命周期控制上需要特别注意,因为不当的管理可能导致内存泄漏或资源浪费。 ### 示例分析:嵌套类的...
通过以上步骤,我们就成功地实现了HorizontalScrollView嵌套GridView,以及在选中item时联动ListView的变化。这种组合方式在需要展示大量横向分类数据,且每个分类下有详细列表的情况下非常有用。在实际项目中,可以...
"Fragment嵌套Fragment实现多tab页面"这个项目就是利用了这一特性来构建一个具有多个选项卡的应用。 在Android中,TabLayout通常与ViewPager结合使用来创建滑动选项卡,每个选项卡对应一个Fragment。Fragment嵌套则...
本示例实现的是一个更复杂的两层Tab嵌套功能,即在一级Tab之间切换时,每个一级Tab下还可能包含多个二级Tab。这种设计可以提供更丰富的用户体验,使用户能够更方便地在深度层次的导航结构中探索应用内容。 一、一级...
例如,如果有一个表示组织结构的类,其中包含子组织的列表,我们可以使用递归或嵌套循环来遍历整个结构: ```java public void traverseOrganization(Organization org) { // 处理当前组织 processOrganization...
这就涉及到了ListView的嵌套使用,也就是一个ListView里面嵌套另一个ListView,来实现类似“评论列表”的效果。本教程将详细介绍如何在Android中使用ListView嵌套来构建这样的功能。 首先,我们要创建主ListView,...
总的来说,VC++中的函数嵌套是通过编译器将嵌套函数转换为类成员实现的,这允许我们在MFC项目中利用函数嵌套来组织和优化代码。然而,使用这种特性时应保持代码的清晰度和可读性,避免滥用。通过理解函数嵌套的工作...
### Java静态内部类(嵌套类)详解 #### 一、静态内部类概念与特性 在Java编程语言中,静态内部类(也被称为嵌套类)是一种特殊的内部类形式,它通过`static`关键字来定义。与普通内部类相比,静态内部类具有以下...
- `NestedScrollingChildHelper`和`NestedScrollingParentHelper`辅助类帮助实现嵌套滑动中的fling行为。 - `fling()`方法用于启动fling动画,根据速度和重力计算出滚动的距离。 - `computeScroll()`方法在View的...
9. **内存管理**:注意内存泄漏问题,尤其是在持有对内外ListView引用的地方,例如匿名内部类的实现中。 10. **项目实践**:在"我的订单AS项目"中,你可以找到一个实际的案例,研究其代码结构、布局文件以及Adapter...
1. 嵌套类外围类需要使用嵌套类对象作为底层实现,并且该嵌套类只用于外围类的实现,且同时可以对用户隐藏该底层实现。从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的...