
常用软件类: |
|杀毒安全 | |联络聊天 | |网络软件 | |多媒体类 | |系统工具 | |图形图像 | |系统工具 | |应用软件 | |行业软件 |
开发设计类: |
|动画制作 | |图像处理 | |3D设计 | |操作系统 | |站长学院 | |网络相关 | |WEB设计 | |数据库类 | |程序开发 |
HRESULT QueryInterface(
REFIID iid, // Identifier of the requested interface
void **ppvObject // Address of output variable that receives the
);
第一个参数是一个要查询的对象的引用标识符。对于IDirectDraw7来说就是IID_IDirectDraw7。使用它,你必须把dxguid.lib链接入你的项目中;第二个参数是一个变量的地址,我们应该在程序的头部先声明一个LPDIRECTDRAW7类型的指针,再把指针的地址传递给这个参数。如果你使用的是Visual C++6.0,你在这儿或许还需要一个类型强制符。如果机器支持你指定的接口,函数将返回一个指向该接口的指针。通过该指针,代码就获得对新接口的方法的访问。如果函数调用成功,返回值是S_OK。
现在我们有了两个接口指针:一个是IDirectDraw接口,另一个是IDirectDraw7。后一个是我们想要的;前一个就没有用了。我们注意,在代码中每当找到一个新的有效对象时,前一个对象就通过Release()函数被释放掉。这个函数很简单:
ULONG Release(void);
返回的值是一个参考数字,只有在程序测试和调试时才用得着这个数字。为了安全起见,你还应该把释放了的指针赋值为NULL。我们也通常在声明这样的指针时设置它为NULL。你跟上我的节奏了吗?可能要记忆的东西太多了,但是你不得不记忆。让我们把谈到的这些做个实例吧,实例的目的是得到IDirectDraw7接口的指针:
LPDIRECTDRAW lpdd = NULL; // pointer to IDirectDraw (temporary)
LPDIRECTDRAW7 lpdd7 = NULL; // pointer to IDirectDraw7 (what we want)
// get the IDirectDraw interface pointer
if (FAILED(DirectDrawCreate(NULL, &lpdd, NULL)))
{
// error-handling code here
}
// query for IDirectDraw7 pointer
if (FAILED(lpdd->QueryInterface(IID_IDirectDraw7, (void**)&lpdd7)))
{
// error-handling code here
}
else
{
// success! release IDirectDraw since we don t need it anymore
lpdd->Release();
lpdd = NULL;
}
现在,如果你是一个C程序员,你可能被调用QueryInterface()和Release()这两个函数的方法弄得有点模糊。你以前可能看过“->”这个符号,在C语言的结构部分,当结构声明了一个指针变量,调用结构成员时,就用“结构指针名->结构成员”,同样的道理,只是这里把结构成员换成了函数。既然说到这个话题,我就介绍一下另一个C++符号,范围定义符号“::”,它是表示从属关系的符号,举个例子你就明白了:比如QueryInterface()函数是属于IUnknown类的,就可以表示为IUnknown::QueryInterface()。我们将来会经常用到这个符号的,所以记住它。
说实在的,以上的主要目的是为了演示怎样使用QueryInterface()方法,它是所有DirectX接口的一部分,所以让我们往下进行。我们将直接使用COM方法获得接口指针。这种方法的好处是你可以立即获得IDirectDraw7接口指针,不用象刚才那么麻烦。首先,你必须得初始化COM,象这样:
HRESULT CoInitialize(LPVOID pvReserved);
不能在容易了,你必须把参数设置为NULL。当你结束COM调用,你需要抛弃它,也很简单:
void CoUninitialize(void);
我通常在DirecX程序的一开始就调用CoInitialize()函数,在程序的最末端,当我释放了所有的DirectX对象后,使用CoUninitialize()。一旦你初始化了COM,你就可以用CoCreateInterface()函数得到你想要的指针,它看起来有点丑陋:
STDAPI CoCreateInstance(
REFCLSID rclsid, // Class identifier (CLSID) of the object
LPUNKNOWN pUnkOuter, // Pointer to whether object is or isn t part
//
上一页 [1] [2] [3] [4] [5] [6] [7] 下一页