VC+ddraw获取显卡显存的方法

#include <fstream>
#include <string>
#include <iostream>

#include <windows.h>
#include <tchar.h>

using namespace std;

#define LOGError( msg )

#include <ddraw.h>
#pragma comment( lib, "dxguid" )

unsigned QueryVideoMemory()
{
IDirectDraw7* pDD = NULL;

HINSTANCE hDDrawLib = ::LoadLibrary( _T("ddraw.dll") );

if( hDDrawLib == NULL )
{
LOGError( " can't get ddraw.dll" );
return 0xffffffff;
}

typedef HRESULT (WINAPI* _DirectDrawCreateExFunc)( GUID*, void**, REFIID, IUnknown* );
_DirectDrawCreateExFunc  _DirectDrawCreateEx = (_DirectDrawCreateExFunc)GetProcAddress( hDDrawLib, "DirectDrawCreateEx" );

if( !_DirectDrawCreateEx )
{
LOGError( "can't address DirectDrawCreateEx!" );
return 0xffffffff;
}

typedef HRESULT (WINAPI* _DirectDrawEnumerateExFunc )( LPDDENUMCALLBACKEX, LPVOID, DWORD );
_DirectDrawEnumerateExFunc _DirectDrawEnumerateEx = (_DirectDrawEnumerateExFunc)GetProcAddress( hDDrawLib, "DirectDrawEnumerateExA" );

if( !_DirectDrawEnumerateEx )
{
LOGError( "can't address DirectDrawEnumerateExA" );
return 0xffffffff;
}

HRESULT result = _DirectDrawCreateEx( NULL, (void**)&pDD, IID_IDirectDraw7, NULL );

if( FAILED(result) )
{
LOGError( "can't create IDDraw7" );
return 0xffffffff;
}

pDD->SetCooperativeLevel( NULL, DDSCL_NORMAL );

// check 
DDSCAPS2 ddscaps2;
DWORD Junk;
DWORD VideoMemory = 0xffffffff;
DWORD Temp = 0;

ZeroMemory( &ddscaps2, sizeof(ddscaps2) );
ddscaps2.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_VIDEOMEMORY;

pDD->GetAvailableVidMem( &ddscaps2, &Temp, &Junk );

if( Temp>0 && Temp<VideoMemory )
{
VideoMemory = Temp;
}

ddscaps2.dwCaps = DDSCAPS_3DDEVICE|DDSCAPS_LOCALVIDMEM|DDSCAPS_TEXTURE|DDSCAPS_VIDEOMEMORY;

pDD->GetAvailableVidMem( &ddscaps2, &Temp, &Junk );

if( Temp > 0 && Temp<VideoMemory )
{
VideoMemory = Temp;
}

ddscaps2.dwCaps = DDSCAPS_LOCALVIDMEM|DDSCAPS_TEXTURE|DDSCAPS_VIDEOMEMORY;
pDD->GetAvailableVidMem( &ddscaps2, &Temp, &Junk );

if( Temp > 0 && Temp<VideoMemory )
{
VideoMemory = Temp;
}

ddscaps2.dwCaps = DDSCAPS_OFFSCREENPLAIN|DDSCAPS_LOCALVIDMEM|DDSCAPS_VIDEOMEMORY;

pDD->GetAvailableVidMem( &ddscaps2, &Temp, &Junk );

if( Temp > 0 && Temp<VideoMemory )
{
VideoMemory = Temp;
}

if( -1 == VideoMemory )
{
LOGError( "can't calculate video ram" );
return 0;
}

const DWORD MEGABYTE = 1048576;

if( VideoMemory <= 16*MEGABYTE )
{
VideoMemory = ( (VideoMemory+8*MEGABYTE-1) & ~ (8*MEGABYTE-1) );
}
else
{
if( VideoMemory <= 64 * MEGABYTE )
{
VideoMemory = ( (VideoMemory + 32 * MEGABYTE - 1) &~( 32*MEGABYTE-1) );
}
else
{
VideoMemory = ( (VideoMemory + 64 * MEGABYTE - 1) &~( 64*MEGABYTE-1) );
}
}

LPDIRECTDRAW2 pDD2;

if( SUCCEEDED( pDD->QueryInterface( IID_IDirectDraw2, (void**)&pDD2 ) ) )
{
DDSCAPS ddscaps;

ddscaps.dwCaps = DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM;

pDD2->GetAvailableVidMem( &ddscaps, &Temp, NULL );

pDD2->Release();
}

unsigned uVRAM = Temp >> 20;

pDD->Release();
pDD = NULL;

::FreeLibrary( hDDrawLib );

return uVRAM;
}

int main(int argc, char* *argv)
{
cout<<"显卡显存为:"<<QueryVideoMemory()<<endl;

return 0;
} 

这样通过DirectDraw API函数就可以轻而易举的获得显卡内存的大小了。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值