创建和使用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组件拥有的数百个函数和接口。不过后面你将看到的。

 

 

C# 下面添加DirectX,DirectSound的引用

今天要用C#开发(vs2010下)DirectSound应用,按照网上说得在:   但我系统里怎么也找不到,我确定安装了DirectX9.0SDK ,因为在C++里做的开发都好好的。 最后...

如何在WinForm项目中调用DX诸多问题解决方案汇总!

最近想在WinForm上调用Directx来渲染绘图,结果遇到了以下这些问题,经过一段时间的尝试这些问题已经得到解决,特此与大家一起分享以下经验! 首先我们来讲讲整个的正常思路,最后会在下面讲解在...

为什么COM里的QueryInterface第二个参数需要使用双重指针?

转载自:http://www.cnblogs.com/perhaps/archive/2004/09/08/41143.html 昨天向COM的世界迈出了第一步,虽然没有想象中那样举步维艰,却也...

新手入门之DirectX入门

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

摸爬滚打DirectX11_day03——关于COM接口对象的一些介绍

目前Windows平台下的开发,主要是以C++与COM接口配DirectX为主要方案。COM(Component Object Model,组件对象模型)是一项能够使DirectX独立于编程语言并向下...

创建一个用于建立快捷方式的COM 对象并取得IShellLink 接口。

/* 第二个例子展示了如何使用一个提供单接口的COM对象QueryInterface()函数。 其中的代码用外壳的Shell Link组件对象类创建我们在第一个例子中获得的 墙纸文件的快捷方式 以...

使用COM接口对象获得当前桌面墙纸的文件名

1.开发环境WINDOWS+VS2010+MFC Dialog Based 2.为了添加接口对象类,需要在stdafx.h中的#include 行之前增加#include   3.在BOO...
  • zzandyc
  • zzandyc
  • 2017年04月13日 22:14
  • 95

【原创】使用vc向导简历的ATL COM简单对象好像没有IUnknown接口的实现?

  这两天看了看COM和ATL,还是有点云里雾里的感觉。对ATL如何实现COM的一个可创建对象还是不太明白,只知道一些概念。知识仅局限于能够使用VC 的向导简历一个ATL工程,增加一个ATL简单对象,...
  • ppslide
  • ppslide
  • 2011年06月17日 13:27
  • 592

使用MFC和晚绑定创建COM对象

  • 2009年10月27日 16:24
  • 648KB
  • 下载

COM组件开发(一)—— 对象与接口

一.前言        在COM规范中,最基本的两个要素就是对象与接口,因为COM就是由这两者来共同实现的。COM对象在组件中是被封装起来的,客户代码只能通过接口来访问COM对象并享受其,由于客户与C...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创建和使用DirectX接口(并再次理解COM对象)
举报原因:
原因补充:

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