创建和使用DirectX接口(并再次理解COM对象)

原创 2012年07月16日 15:36:42

再次理解COM对象:

以前说:一个COM对象事实上是一个或一套实现了大量接口的C++类,这些接口用于和COM对象进行交流!!!

现在说:COM对象其实就是接口集,该接口集也就是函数指针(更准确的说是VTABLE)。

个人理解:由上一篇博客“一个可运行的COM程序”可推测,一个COM对象就是最终实现了一系列接口(如CCOM_OBJECT实现了IX、IY)的那个类产生的一个实例(和C++中一般的对象相类比),这个实例对象可以通过其实现的QueryInterface()方法检索出指向各个接口(IX、IY)的指针(该指针指向相应的虚函数表),也就是实现了同一个COM对象个接口之间可以相互切换!!!

 

使用DirectX COM对象来工作,只要创建COM兑现,获得一个接口指针,然后使用正确的语法调用接口即可。。。

举例:我用主DirectDraw接口来演示一下

先决基础:

1、DirectDraw运行时COM对象和DDL必须被加载和注册。这是DirectX安装程序干的事情。
·2、你必须在你的win32程序中include DDRAW.LIB输入库,以便可以链接到你调用的函数。
·3、你必须在你的程序中include DDRAW.H,这样编译器才能够识别到DirectDraw的头文件信息、原型声明很数据类型。

  知道这些之后,下面是DirectDraw1.0接口指针的数据类型
    LPDIRECTDRAW lpdd = NULL;


  以及DirectDraw4.0接口指针的数据类型:
  LPDIRECTDRAW7 lpdd = NULL;


  以及DirectDraw7.0的:
  LPDIRECTDRAW7 lpdd = NULL;


 不过没有8.0的了。

现在,创建创建DirectDraw COM对象并获得DirectDraw对象的接口指针(DirectDraw对象代表显卡),你所要做的一切便是想下面这般使用打包了的函数DirectDrawCreate():
       DirectDrawCreate(NULL, &lpdd, NULL);/////////&lpdd也就是(**iface类型)
这将返回基本的DirectDraw1.0接口。这个调用创建一个DirectDraw对象,并把接口指针赋给lpdd。

当然,通过使用QueryInterface(),你可以从最初的DirectDraw接口跳转到任何你想使用的接口上(比如DirectX3D)。甚至,有多个DirectX版本,不久前,Microsoft停止了编写获得任何最新界面的打包函数。所以,有时,你不得不自己使用QueryInterface()手动获得最新版本的DirectX接口。让我们对此研究研究。

例如:

// now look in DDRAW.H header, find IDIRECTDRAW7 interface
// ID and use it to query for the interface
lpdd->QueryInterface(IID_IDirectDraw7, &lpdd7);////通过DirectDraw 1.0接口转到7.0接口

此刻,你有两个接口指针。但你不需要指向IDIRECTDRAW的指针。所以你应该释放该指针。
// release, decrement reference count
lpdd->Release();

// set to NULL to be safe
lpdd = NULL;

记住了吗?当你用完了之后你应当释放接口。因而,但你的程序结束时你同样应当释放IDIRECTDRAW7接口,如下:
// release, decrement reference count
lpdd7->Release();

// set to NULL to be safe
lpdd7 = NULL;

Ok,现在你知道如何从一个接口得到另一个接口指针了吧。就是使用QueryInterface()函数;

在DirectX7.0中,Microsoft添加了一个新函数DirectDrawCreateEx(),直接返回IDIRECTDRAW7接口,不需要使用DirectDraw1.0作为中介。神奇吧?但他们又在DirectX8.0中枪毙了该函数。但谁在乎呢?反正我们仍然可以使用这个函数:


HRESULT WINAPI DirectDrawCreateEx(
GUID FAR *lpGUID, // the GUID of the driver, NULL for active display
LPVOID *lplpDD, // receiver of the interface
REFIID iid, // the interface ID of the interface you are requesting
IUnknown FAR *pUnkOuter // advanced COM, NULL
);

                                                     *****************************************************************
这个新函数允许你发生一个iid(每一个COM对象以及接口都必须有一个唯一的128位标识符)*表明想要请求的DirectDraw版本,然后函数将为你创建一个COM对象。

我们只需这样调用函数:          *******************************************************************

LPDIRECTDRAW7   lpdd; // version 7.0

// create version 7.0 DirectDraw object interface


DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL);

 

基本上,对DirectDrawCreateEx的调用直接创建一个所要求的接口。所以你无须用DirectDraw1.0做为中介了。

好了,这便是所有有关使用DirectX和COM的知识。当然,你还没有看到DirectX组件拥有的数百个函数和接口。不过后面你将看到的。

 

 

新手入门之DirectX入门

☆ 简介 今天我们要接触到令人敬畏的DirectX。它比Windows GDI要快好几倍,可用于不同的语言和多种平台,支持从绘制象素到高级3D图象,从播放简单声音到数字音乐,从键盘控制到反震手柄...
  • butcher986115
  • butcher986115
  • 2016年01月27日 18:00
  • 1368

Directx9.0编程学习笔记二(Direcx接口的初始化)

在代码中加入以下两条预处理语句: #include "d3dx9.h" //Driect9.0的头文件 #pragma comment(lib,"d3d9.lib") 初始化DirectX首先要声明以...
  • lishunihaoa
  • lishunihaoa
  • 2016年06月09日 00:40
  • 167

DirectX 图形接口指南

  这篇文章在我的博客的左边图形方面的连接里有.在这里重贴是因为我对文章进行了整合.原作者允许转贴,我按照原作者的要求贴了声明.我给这篇文章定的级别是:入门级这是SDK里翻译过来的,读者也可以看原版(...
  • begtostudy
  • begtostudy
  • 2007年07月24日 11:40
  • 1455

创建和使用DirectX接口(并再次理解COM对象)

再次理解COM对象: 以前说:一个COM对象事实上是一个或一套实现了大量接口的C++类,这些接口用于和COM对象进行交流!!! 现在说:COM对象其实就是接口集,该接口集也就是函数指针(更准确的说...
  • yaoxinchao
  • yaoxinchao
  • 2012年07月16日 15:36
  • 1638

创建COM并调用

在自动生成的PCOMServer_TLB.cpp中修改AddInt函数代码,实现此函数的功能。 创建客户端过程如下: project->Import Type Library 找到创建的COM类型库 ...
  • chinayu2007
  • chinayu2007
  • 2016年01月26日 20:00
  • 182

【JAVA】32、对象的创建与使用

本篇介绍对象的创建与使用
  • omoiato
  • omoiato
  • 2016年03月07日 22:34
  • 813

【Visual C++】游戏开发笔记三十二 浅墨DirectX提高班之一 DirectX大局观认知篇

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。  文章链接:  http://blog.csdn.net/zhmxy555/article/details/8172615 作者:毛星云(...
  • zhmxy555
  • zhmxy555
  • 2012年11月12日 01:51
  • 36668

DirectX中文手册

DirectX中文手册 目  录 第一章 DirectX基础(初级篇) 第一节  什么是DirectX 一、什么是DirectX ? 二、DirectX的组成部分 三、关于Direct...
  • tudou880306
  • tudou880306
  • 2015年06月19日 14:08
  • 2984

Java中创建对象的几种方式

创建对象方式 Java开发中,我们每天会创建很多对象,也会使用依赖注入的方式管理系统,比如:Spring去创建对象。然后究竟有多少种创建对象的方法呢? 这里列举一下:使用New关键字、使用Clas...
  • hustzw07
  • hustzw07
  • 2017年05月19日 10:10
  • 200

从头认识java-1.8 创建和操纵对象(1)

这一章节我们来讨论一些创建和操纵对象。说来,上面的两个话题都看似简单。例如:使用new创建对象:new String()使用new来创建了一个文本对象。使用引用操纵对象String s;新建一个s变量...
  • raylee2007
  • raylee2007
  • 2015年10月20日 14:04
  • 1780
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创建和使用DirectX接口(并再次理解COM对象)
举报原因:
原因补充:

(最多只允许输入30个字)