游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3349|回复: 7

请问为什么在ddraw.h中看不到directdraw的定义?

[复制链接]

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2004-11-6 19:38:00 | 显示全部楼层 |阅读模式
我看了一下ddraw.h,里面没有directdraw的com对象定义,只有IDirectDraw,IDirectSurface等借口的定义,为什么?大家多指点,迷茫中。。。。

13

主题

978

帖子

978

积分

高级会员

Rank: 4

积分
978
发表于 2004-11-6 22:01:00 | 显示全部楼层

Re:请问为什么在ddraw.h中看不到directdraw的定义?

定义应该在lib里面吧……我也不懂……

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2004-11-6 22:20:00 | 显示全部楼层

Re:请问为什么在ddraw.h中看不到directdraw的定义?

多谢回复!
会在lib里吗?自己顶一下,希望大家能给个权威点的答案。多谢!

20

主题

473

帖子

502

积分

高级会员

Rank: 4

积分
502
发表于 2004-11-7 15:38:00 | 显示全部楼层

Re:请问为什么在ddraw.h中看不到directdraw的定义?

.h里面应该有一系列DDRAW COM 对象的GUID定义
所有的com interface都是从这些GUID直接创建的
因为COM对象本身根本不用包含任何实体,所有的都是通过查询接口来实现功能的

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2004-11-7 22:04:00 | 显示全部楼层

Re:请问为什么在ddraw.h中看不到directdraw的定义?

那请问当我们调用IDirectDraw的Release()时,到底是release了com对象,还是接口本身?按道理来说,com对象至少要有个m_Ref变量阿。实在搞不懂,请楼上大侠指点。

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2004-11-8 01:52:00 | 显示全部楼层

Re:请问为什么在ddraw.h中看不到directdraw的定义?

只要你能看懂以下的程序,就可以搞懂ddraw的定义了:
首先,它使用了COM技术,有点像“工厂类”,如下:
1、定义其基类
class IDirectDraw: public IUnknown
{
virtual void Release() = 0;//等等函数
……
}
typedef IDirectDraw *LPDIRECTDRAW;
2、在具体的实现中,当然是在你看不见的源程序部分,使用继承机制,当然可能具体实现中不叫DirectDrawImp(我自己杜撰的名字),然后实现每个具体的函数。
class DirectDrawImp: public IDirectDraw
{
……
}
3、每个“工厂类”都有一个工厂构造函数,类似于DirectDrawCreateEx(),当然,我为了简化问题,使用了一个杜撰的名字:
LPDIRECTDRAW MyCreateDirectDraw()
{
    return (new DirectDrawImp);
}
4、因为在C++中可以将派生类的指针转换成基类的指针,所以你用第三步得到的基类指针就可以访问在其内部定义的函数了,而且别人也看不到具体的实现,看到的只是IDirectDraw定义的接口部分的函数。

LPDIRECDRAW lpDD = MyCreateDirectDraw();
lpDD->Release();

当然,以上只是对“工厂类”的实现作了一个介绍,可以将DirectDraw使用的技术看成是“工厂类”,这样便于理解,前提是不要联系COM的情况。
另外,不要被ddraw.h里面的定义吓坏,不如STDMETHOD等等,多看看宏,把它展开了就简单了,INTERFACE也仅仅是个struct。

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2004-11-8 12:33:00 | 显示全部楼层

Re:请问为什么在ddraw.h中看不到directdraw的定义?

Release只是把COM对象的使用计数值减一
当这个值为零时COM对象就会被释放

这个跟DLL是一样的

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
 楼主| 发表于 2004-11-8 18:02:00 | 显示全部楼层

Re:请问为什么在ddraw.h中看不到directdraw的定义?

多谢两位,我最近在看《com原理与应用》,多多交流:)

听说ATL不使用多继承实现com对象的,而是用了嵌套类,这样也能实现com对象的内存模型?嵌套类的内存模型是如何的呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 03:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表