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

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

C#WPF无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“System.Speech.Internal.SapiInterop.ISpDataKey”。解决办法

无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“System.Speech.Internal.SapiInterop.ISpDataKey”。此操作失败的原因是...
  • wyx100
  • wyx100
  • 2015-02-19 12:07
  • 3395

第一个例子展示的是单接口COM对象

用例子代码总结上述内容 下面用两个例子演示本文所讲的COM概念。代码中还包含了本文的例子工程。 使用单接口COM对象 第一个例子展示的是单接口COM对象。这可能是你碰到得最简单的例子。...

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

一.前言        在COM规范中,最基本的两个要素就是对象与接口,因为COM就是由这两者来共同实现的。COM对象在组件中是被封装起来的,客户代码只能通过接口来访问COM对象并享受其,由于客户与C...

无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Wor

无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Wor...

COM组件的接口和对象

一、 前言 在COM规范中,最基本的两个要素就是对象与接口,因为COM就是由这两者来共同实现的。COM对象在组件中是被封装起来的,客户代码只能通过接口来访问COM对象并享受其服务,由于客户与COM...

COM 对象强制转换为接口类型问题

先看问题: 无法将类型为“System.__ComObject”的 COM 对象强制转换为接口类型“Microsoft.VisualStudio.Tools.Applications.Runtime...

WCE下创建MFC的COM对象及使用方法(一)

转载请标明是引用于 http://blog.csdn.net/chenyujing1234 平台:VS2005+MIPSSDK  例子代码:  http://www.rayfile.com/zh...

COM对象创建过程总结

  • 2015-03-04 12:58
  • 16KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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