#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函数就可以轻而易举的获得显卡内存的大小了。