`
narwhal
  • 浏览: 6680 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

一个COM演示代码

 
阅读更多
#include "stdafx.h"

#include <iostream>
using namespace std;
#include <objbase.h>

void trace(const char* msg) 
{ 
	cout << msg << endl;
}

// interface definition
interface IX : IUnknown
{
	virtual void __stdcall Fx() = 0;
};

interface IY : IUnknown
{
	virtual void __stdcall Fy() = 0;
};

interface IZ : IUnknown
{
	virtual void __stdcall Fz() = 0;
};

// Forward references for GUIDs
extern const IID IID_IX;
extern const IID IID_IY;
extern const IID IID_IZ;

//
// implement interface IX,IY (A COM component)
//
class CA : public IX, public IY
{
	// IUnknown implementation
	virtual HRESULT __stdcall QueryInterface(const IID& iid, void** ppv);            
	virtual ULONG __stdcall AddRef() { return 0;}
	virtual ULONG __stdcall Release() { return 0;}

	// Interface IX implementation
	virtual void __stdcall Fx() { cout << "This is Fx func" << endl;}

	// Interface IY implementation
	virtual void __stdcall Fy() { cout << "This is Fy func" << endl;}
};

HRESULT __stdcall CA::QueryInterface(const IID& iid, void** ppv)
{     
	if (iid == IID_IUnknown)
	{
		trace("QueryInterface: Return pointer to IUnknown.");
		*ppv = static_cast<IX*>(this);
	}
	else if (iid == IID_IX)
	{
		trace("QueryInterface: Return pointer to IX.");
		*ppv = static_cast<IX*>(this);
	}
	else if (iid == IID_IY)
	{
		trace("QueryInterface: Return pointer to IY.");
		*ppv = static_cast<IY*>(this);
	}
	else
	{         
		trace("QueryInterface: Interface not supported.");
		*ppv = NULL;
		return E_NOINTERFACE;
	}
	reinterpret_cast<IUnknown*>(*ppv)->AddRef(); // add reference num

	return S_OK;
}

//
// create class CA, return a pointer to IUnknown
//
IUnknown* CreateInstance()
{
	IUnknown* pI = static_cast<IX*>(new CA);
	pI->AddRef();
	return pI ;
}

//
// IID of interfaces
//
// {32bb8320-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IX = 
{0x32bb8320, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};

// {32bb8321-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IY = 
{0x32bb8321, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};

// {32bb8322-b41b-11cf-a6bb-0080c7b2d682}
static const IID IID_IZ = 
{0x32bb8322, 0xb41b, 0x11cf,
{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}};

//
// main functionclient)
//
int _tmain(int argc, _TCHAR* argv[])
{
	HRESULT hr;

	trace("Client:get IUnknown pointer.");
	IUnknown* pIUnknown = CreateInstance();

	trace("Client:get interface IX.");
	IX* pIX = NULL; 
	hr = pIUnknown->QueryInterface(IID_IX, (void**)&pIX);
	if (SUCCEEDED(hr))
	{
		trace("Client: Succeeded getting IX.");
		pIX->Fx();          // using IX.
	}

	trace("Client:get interface IY.");
	IY* pIY = NULL;
	hr = pIUnknown->QueryInterface(IID_IY, (void**)&pIY);
	if (SUCCEEDED(hr))
	{
		trace("Client: Succeeded getting IY.");
		pIY->Fy();          // using IY.
	}

	trace("Client:whether support interface IZ.");
	IZ* pIZ = NULL;
	hr = pIUnknown->QueryInterface(IID_IZ, (void**)&pIZ);
	if (SUCCEEDED(hr))
	{
		trace("Client: Succeeded getting IZ.");
		pIZ->Fz();
	}
	else
	{
		trace("Client: Failed getting IZ,can't support IZ.");
	}

	trace("Client:using interface IX to query interface IY.");
	IY* pIYfromIX = NULL;
	hr = pIX->QueryInterface(IID_IY, (void**)&pIYfromIX);
	if (SUCCEEDED(hr))
	{    
		trace("Client: Succeeded getting IY.");
		pIYfromIX->Fy();
	}

	trace("Client:using interface IY query interface IUnknown.");
	IUnknown* pIUnknownFromIY = NULL;
	hr = pIY->QueryInterface(IID_IUnknown, (void**)&pIUnknownFromIY);
	if (SUCCEEDED(hr))
	{
		cout << "pIUnknownFromIY equal to IUnknown ?";
		if (pIUnknownFromIY == pIUnknown)
		{
			cout << "Yes, pIUnknownFromIY == pIUnknown." << endl;
		}
		else
		{
			cout << "No, pIUnknownFromIY != pIUnknown." << endl;
		}
	}

	// Delete the component.
	delete pIUnknown;

	return 0;
}


  • 大小: 132 KB
分享到:
评论

相关推荐

    第四章 格式化文字代码和演示代码.rar_演示代码

    2. **针对性**:针对一个特定功能或问题,代码应简洁且直接地解决该问题。 3. **注释丰富**:为了便于理解,演示代码通常包含详尽的注释,解释每一步操作的目的。 4. **易于理解**:使用基础和常见的编程结构,避免...

    aes算法演示代码

    使用这个AES演示代码,开发者可以了解如何在Delphi环境下集成AES加密功能,这有助于保护敏感数据,例如用户密码、个人信息或商业机密。同时,它也可以作为一个学习工具,帮助理解AES算法的工作原理。通过阅读和分析...

    格式化文字代码和演示代码.rar_文字游戏_输入法

    这里我们主要探讨“格式化文字代码”和“演示代码”这两个概念,以及它们如何与“文字游戏”和“输入法”相结合。 首先,让我们来看看“格式化文字代码”。在编程中,代码的格式化至关重要,它关乎到代码的可读性和...

    PHP源代码演示文件

    本资源“PHP源代码演示文件”旨在为初学者提供一个学习PHP编程的基础平台,通过实际的源代码示例来帮助理解PHP的工作原理和编程技巧。 PHP的核心特性包括其动态类型、命令行接口能力以及能够嵌入到HTML中的功能。源...

    RemObjects三层演示代码

    这个“RemObjects三层演示代码”很显然是一个示例项目,展示了如何使用RemObjects技术来构建一个典型的三层架构应用。三层架构通常包括表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问...

    已完成部分程序演示

    在本项目中,我们关注的是一个已完成的部分程序演示,它是一个围棋对战平台。这个平台提供了用户之间进行围棋游戏的功能,让爱好者们可以在线上进行切磋与学习。通过提供的博文链接...

    一个基于VC的3D游戏引擎演示代码.rar

    6. **游戏开发经验与积累**:通过分析和修改这个演示代码,开发者可以学习到3D游戏开发的流程,包括场景构建、物体运动、动画处理、用户交互等,这些都是游戏开发中的重要知识点。 7. **www.NewXing.com**:这个...

    COM组件技术的演示代码

    最近看com组件技术,自己照着书上的例子写了一段com组件最简单的实现。虽然简单,但是却能反应com组件技术的实现内幕,很值得一看。

    SpringBoot集成apollo项目演示代码

    在IT行业中,SpringBoot是一个非常流行的Java开发框架,它简化了Spring应用的初始化和配置过程。而Apollo则是阿里巴巴开源的一款分布式配置中心,它能够集中化管理应用的配置,方便在分布式环境中快速迭代和运维。本...

    一个ADO演示考试程序的源代码.rar_考试 ado

    【标题】"一个ADO演示考试程序的源代码.rar_考试 ado"揭示了这是一个基于ADO(ActiveX Data Objects)技术的编程示例,主要用于构建一个简易的考试系统。ADO是Microsoft开发的一个数据访问接口,它允许程序员通过...

    高速屏幕传输演示代码

    【标题】"高速屏幕传输演示代码"涉及到的技术领域主要是计算机图形学、网络传输以及实时数据处理。高速屏幕传输指的是能够快速高效地将一个设备的屏幕内容传输到另一个设备上,这种技术在远程桌面、视频会议、游戏...

    4_6仙剑奇侠传游戏演示源代码

    《4_6仙剑奇侠传游戏演示源代码》是一个基于VC++开发的游戏演示项目,主要涉及了角色类的设计和管理。在这个项目中,开发者创建了一个基础的角色类,该类可以被用来创建多个具有不同特性的角色。角色类的设计是程序...

    嵌入式表达式系统代码和演示代码.rar_游戏 网络_表达式_输入法

    "嵌入式表达式系统代码和演示代码"这部分很可能包含了实现上述功能的源代码示例。这些代码可能包括了词法分析器、语法解析器、表达式求值器等组件,用于构建一个完整的表达式处理框架。开发者可以通过研究这些代码,...

    JDBC演示代码1.zip

    综上所述,"JDBC演示代码1.zip"中的示例将涵盖以上提到的JDBC基本操作,为开发者提供了一个实用的起点,以便理解和实践Java与MySQL数据库的交互。通过这些代码,你可以深入理解JDBC的工作原理,掌握如何在Java程序中...

    Java实现QR解码的演示代码.rar

    3. Zxing库使用:使用Zxing库,你可以创建一个`com.google.zxing.MultiFormatReader`实例,然后使用`decode(BinaryBitmap)`方法来解码图像。`BinaryBitmap`是对图像的抽象,你可以通过`ImageSource`接口从Java AWT或...

    Java中的泛型方法演示代码

    在这个“Java中的泛型方法演示代码”中,我们可以期待看到如何在Java中定义和使用泛型方法的实例。 首先,泛型方法的基本语法是在方法声明前加上尖括号`&lt;&gt;`,并在其中定义一个或多个类型参数。例如: ```java ...

    弹簧摆matlab演示及源代码.doc

    弹簧摆matlab演示及源代码 弹簧摆matlab演示及源代码是利用 ...总结来说,本资源提供了一个使用 matlab 对弹簧摆系统进行运动微分方程求解和模拟演示的例子,展示了 matlab 在科学计算和数据可视化方面的强大功能。

    DWGdirect.Net and ActiveX 3.3.0 安装包+文档+演示代码.zip

    DWGdirect.Net和ActiveX 3.3.0是一个针对.NET和ActiveX平台的软件开发工具包,专门用于处理Autodesk的DWG图纸文件格式。这个安装包包含了开发者需要的所有资源,包括库文件、文档以及演示代码,以便于在C#环境中集成...

    基于VC++的3D游戏引擎演示代码

    通过阅读和分析演示代码,你可以了解到如何组织和设计一个复杂的游戏系统,这对未来从事游戏开发或者其他图形应用的开发工作大有裨益。 【 Steroid子文件解析】 " Steroid "可能是这个3D游戏引擎的示例项目或库的...

    对话框中使用打印预览的演示代码2.rar_对话框 打印预览_打印预览

    标题"对话框中使用打印预览的演示代码2.rar"表明这是一个关于如何在对话框中实现打印预览功能的示例代码集。通常,这样的代码会展示如何利用MFC(Microsoft Foundation Classes)或者Windows API来创建一个包含打印...

Global site tag (gtag.js) - Google Analytics