隐藏的BUG——SetDisplayMode()

来源:互联网 发布:使命召唤 ol命运数据 编辑:程序博客网 时间:2024/05/21 19:33

最近用Direct Draw进行窗口的绘图,发现一运行到某处,就会出现异常。如lpdd是nullptr。
说明该指针指向了空地址。
百思不得其解,于是乎一遍一遍地调试该函数块,还是没发现如何解决问题。然后再像“栈”一样,后入先出地慢慢地调试,终于找到了这个隐藏的小BUG——SetDisplayMode().
Code:

//........LPDIRECTDRAW7       lpdd=NULL;//Create IDirectDraw interface 7.0 objectif(FAILED(DirectDrawCreateEx(NULL,(void **)&lpdd,IID_IDirectDraw7,NULL))){    ::MessageBox(NULL,"DirectDraw object created error","Tips",NULL);    return 0;}//set the cooperative level with Windows OSif(FAILED(lpdd->SetCooperativeLevel(handle,DDSCL_NORMAL))){  return 0;}//set display modeif(FAILED(lpdd->SetDisplayMode(640,480,8,00))){    return 0;}  

多次调试都是到SetDisplayMode处,直接就return 0了。
MSDN中SetDisplayMode的函数原型:

HRESULT SetDisplayMode(DWORD dwWidth,                       DWORD dwHeight,                       DWORD dwBPP,                       DWORD dwRefreshRate,                       DWORD dwFlags);//一般后面两个参数默认为0

然后把宽度和高度分别改了改,(800,600),(1024,768),(1280,1024)还是一样直接return 0。
几经测试,把dwBPP第三个参数变为32即可,每个像素32bit.
经别人提示使用GetDisplayMode函数也可以达到一样的效果,不过要先进行设置DDSURFACEDESC2 的对象参数,再进行调用。

以前写该程序时,不会出现如此问题,想了想应该是最近显卡进行了更新,使得电脑不得不放弃一些落后的东西。

阅读全文
0 0