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

#include 
#include 
#include 

#include 
#include 

using namespace std;

#define LOGError( msg )

#include 
#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 && TempGetAvailableVidMem( &ddscaps2, &Temp, &Junk );

if( Temp > 0 && TempGetAvailableVidMem( &ddscaps2, &Temp, &Junk );

if( Temp > 0 && TempGetAvailableVidMem( &ddscaps2, &Temp, &Junk );

if( Temp > 0 && TempQueryInterface( 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<<"显卡显存为:"<

这样通过DirectDraw API函数就可以轻而易举的获得显卡内存的大小了。

你可能感兴趣的:(PC,Hardware,VC++程序设计,winapi,null,include,video)