344 lines
12 KiB
C++
344 lines
12 KiB
C++
|
|
|
||
|
|
//-----------------------------------------------------------------------------
|
||
|
|
// File: GetDXVer.cpp
|
||
|
|
//
|
||
|
|
// Desc: Demonstrates how applications can detect what version of DirectX
|
||
|
|
// is installed.
|
||
|
|
//
|
||
|
|
// (C) Copyright 1995-1997 Microsoft Corp. All rights reserved.
|
||
|
|
//-----------------------------------------------------------------------------
|
||
|
|
#include <windows.h>
|
||
|
|
#include <windowsx.h>
|
||
|
|
#include <ddraw.h>
|
||
|
|
#define DIRECTINPUT_VERSION 0x0700
|
||
|
|
#include <dinput.h>
|
||
|
|
//#include <dmusici.h>
|
||
|
|
|
||
|
|
typedef HRESULT(WINAPI * DIRECTDRAWCREATE)( GUID*, LPDIRECTDRAW*, IUnknown* );
|
||
|
|
typedef HRESULT(WINAPI * DIRECTDRAWCREATEEX)( GUID*, VOID**, REFIID, IUnknown* );
|
||
|
|
typedef HRESULT(WINAPI * DIRECTINPUTCREATE)( HINSTANCE, DWORD, LPDIRECTINPUT*,
|
||
|
|
IUnknown* );
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
//-----------------------------------------------------------------------------
|
||
|
|
// Name: GetDXVersion()
|
||
|
|
// Desc: This function returns two arguments:
|
||
|
|
// dwDXVersion:
|
||
|
|
// 0x0000 = No DirectX installed
|
||
|
|
// 0x0100 = DirectX version 1 installed
|
||
|
|
// 0x0200 = DirectX 2 installed
|
||
|
|
// 0x0300 = DirectX 3 installed
|
||
|
|
// 0x0500 = At least DirectX 5 installed.
|
||
|
|
// 0x0600 = At least DirectX 6 installed.
|
||
|
|
// 0x0601 = At least DirectX 6.1 installed.
|
||
|
|
// 0x0700 = At least DirectX 7 installed.
|
||
|
|
// dwDXPlatform:
|
||
|
|
// 0 = Unknown (This is a failure case)
|
||
|
|
// VER_PLATFORM_WIN32_WINDOWS = Windows 9X platform
|
||
|
|
// VER_PLATFORM_WIN32_NT = Windows NT platform
|
||
|
|
//
|
||
|
|
// Please note that this code is intended as a general guideline. Your
|
||
|
|
// app will probably be able to simply query for functionality (via
|
||
|
|
// QueryInterface) for one or two components.
|
||
|
|
//
|
||
|
|
// Please also note:
|
||
|
|
// "if (dxVer != 0x500) return FALSE;" is BAD.
|
||
|
|
// "if (dxVer < 0x500) return FALSE;" is MUCH BETTER.
|
||
|
|
// to ensure your app will run on future releases of DirectX.
|
||
|
|
//-----------------------------------------------------------------------------
|
||
|
|
VOID GetDXVersion( DWORD* pdwDXVersion, DWORD* pdwDXPlatform )
|
||
|
|
{
|
||
|
|
*pdwDXVersion = 0x0700;
|
||
|
|
*pdwDXPlatform = VER_PLATFORM_WIN32_NT;
|
||
|
|
// HRESULT hr;
|
||
|
|
// HINSTANCE DDHinst = 0;
|
||
|
|
// HINSTANCE DIHinst = 0;
|
||
|
|
// LPDIRECTDRAW pDDraw = 0;
|
||
|
|
// LPDIRECTDRAW2 pDDraw2 = 0;
|
||
|
|
// DIRECTDRAWCREATE DirectDrawCreate = 0;
|
||
|
|
// DIRECTDRAWCREATEEX DirectDrawCreateEx = 0;
|
||
|
|
// DIRECTINPUTCREATE DirectInputCreate = 0;
|
||
|
|
// OSVERSIONINFO osVer;
|
||
|
|
// LPDIRECTDRAWSURFACE pSurf = 0;
|
||
|
|
// LPDIRECTDRAWSURFACE3 pSurf3 = 0;
|
||
|
|
// LPDIRECTDRAWSURFACE4 pSurf4 = 0;
|
||
|
|
|
||
|
|
// // First get the windows platform
|
||
|
|
// osVer.dwOSVersionInfoSize = sizeof(osVer);
|
||
|
|
// if( !GetVersionEx( &osVer ) )
|
||
|
|
// {
|
||
|
|
// (*pdwDXPlatform) = 0;
|
||
|
|
// (*pdwDXVersion) = 0;
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// if( osVer.dwPlatformId == VER_PLATFORM_WIN32_NT )
|
||
|
|
// {
|
||
|
|
// (*pdwDXPlatform) = VER_PLATFORM_WIN32_NT;
|
||
|
|
|
||
|
|
// // NT is easy... NT 4.0 is DX2, 4.0 SP3 is DX3, 5.0 is DX5
|
||
|
|
// // and no DX on earlier versions.
|
||
|
|
// if( osVer.dwMajorVersion < 4 )
|
||
|
|
// {
|
||
|
|
// (*pdwDXVersion) = 0; // No DX on NT3.51 or earlier
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// if( osVer.dwMajorVersion == 4 )
|
||
|
|
// {
|
||
|
|
// // NT4 up to SP2 is DX2, and SP3 onwards is DX3, so we are at least DX2
|
||
|
|
// (*pdwDXVersion) = 0x200;
|
||
|
|
|
||
|
|
// // We're not supposed to be able to tell which SP we're on, so check for dinput
|
||
|
|
// DIHinst = LoadLibrary( "DINPUT.DLL" );
|
||
|
|
// if( DIHinst == 0 )
|
||
|
|
// {
|
||
|
|
// // No DInput... must be DX2 on NT 4 pre-SP3
|
||
|
|
// OutputDebugString( "Couldn't LoadLibrary DInput\r\n" );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// DirectInputCreate = (DIRECTINPUTCREATE)GetProcAddress( DIHinst,
|
||
|
|
// "DirectInputCreateA" );
|
||
|
|
// FreeLibrary( DIHinst );
|
||
|
|
|
||
|
|
// if( DirectInputCreate == 0 )
|
||
|
|
// {
|
||
|
|
// // No DInput... must be pre-SP3 DX2
|
||
|
|
// OutputDebugString( "Couldn't GetProcAddress DInputCreate\r\n" );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// // It must be NT4, DX2
|
||
|
|
// (*pdwDXVersion) = 0x300; // DX3 on NT4 SP3 or higher
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
// // Else it's NT5 or higher, and it's DX5a or higher: Drop through to
|
||
|
|
// // Win9x tests for a test of DDraw (DX6 or higher)
|
||
|
|
// }
|
||
|
|
// else
|
||
|
|
// {
|
||
|
|
// // Not NT... must be Win9x
|
||
|
|
// (*pdwDXPlatform) = VER_PLATFORM_WIN32_WINDOWS;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// // Now we know we are in Windows 9x (or maybe 3.1), so anything's possible.
|
||
|
|
// // First see if DDRAW.DLL even exists.
|
||
|
|
// DDHinst = LoadLibrary( "DDRAW.DLL" );
|
||
|
|
// if( DDHinst == 0 )
|
||
|
|
// {
|
||
|
|
// (*pdwDXVersion) = 0;
|
||
|
|
// (*pdwDXPlatform) = 0;
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// // See if we can create the DirectDraw object.
|
||
|
|
// DirectDrawCreate = (DIRECTDRAWCREATE)GetProcAddress( DDHinst, "DirectDrawCreate" );
|
||
|
|
// if( DirectDrawCreate == 0 )
|
||
|
|
// {
|
||
|
|
// (*pdwDXVersion) = 0;
|
||
|
|
// (*pdwDXPlatform) = 0;
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// OutputDebugString( "Couldn't LoadLibrary DDraw\r\n" );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// hr = DirectDrawCreate( NULL, &pDDraw, NULL );
|
||
|
|
// if( FAILED(hr) )
|
||
|
|
// {
|
||
|
|
// (*pdwDXVersion) = 0;
|
||
|
|
// (*pdwDXPlatform) = 0;
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// OutputDebugString( "Couldn't create DDraw\r\n" );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// // So DirectDraw exists. We are at least DX1.
|
||
|
|
// (*pdwDXVersion) = 0x100;
|
||
|
|
|
||
|
|
// // Let's see if IID_IDirectDraw2 exists.
|
||
|
|
// hr = pDDraw->QueryInterface( IID_IDirectDraw2, (VOID**)&pDDraw2 );
|
||
|
|
// if( FAILED(hr) )
|
||
|
|
// {
|
||
|
|
// // No IDirectDraw2 exists... must be DX1
|
||
|
|
// pDDraw->Release();
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// OutputDebugString( "Couldn't QI DDraw2\r\n" );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// // IDirectDraw2 exists. We must be at least DX2
|
||
|
|
// pDDraw2->Release();
|
||
|
|
// (*pdwDXVersion) = 0x200;
|
||
|
|
|
||
|
|
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
// // DirectX 3.0 Checks
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
// // DirectInput was added for DX3
|
||
|
|
// DIHinst = LoadLibrary( "DINPUT.DLL" );
|
||
|
|
// if( DIHinst == 0 )
|
||
|
|
// {
|
||
|
|
// // No DInput... must not be DX3
|
||
|
|
// OutputDebugString( "Couldn't LoadLibrary DInput\r\n" );
|
||
|
|
// pDDraw->Release();
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// DirectInputCreate = (DIRECTINPUTCREATE)GetProcAddress( DIHinst,
|
||
|
|
// "DirectInputCreateA" );
|
||
|
|
// if( DirectInputCreate == 0 )
|
||
|
|
// {
|
||
|
|
// // No DInput... must be DX2
|
||
|
|
// FreeLibrary( DIHinst );
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// pDDraw->Release();
|
||
|
|
// OutputDebugString( "Couldn't GetProcAddress DInputCreate\r\n" );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// // DirectInputCreate exists. We are at least DX3
|
||
|
|
// (*pdwDXVersion) = 0x300;
|
||
|
|
// FreeLibrary( DIHinst );
|
||
|
|
|
||
|
|
// // Can do checks for 3a vs 3b here
|
||
|
|
|
||
|
|
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
// // DirectX 5.0 Checks
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
// // We can tell if DX5 is present by checking for the existence of
|
||
|
|
// // IDirectDrawSurface3. First, we need a surface to QI off of.
|
||
|
|
// DDSURFACEDESC ddsd;
|
||
|
|
// ZeroMemory( &ddsd, sizeof(ddsd) );
|
||
|
|
// ddsd.dwSize = sizeof(ddsd);
|
||
|
|
// ddsd.dwFlags = DDSD_CAPS;
|
||
|
|
// ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
|
||
|
|
|
||
|
|
// hr = pDDraw->SetCooperativeLevel( NULL, DDSCL_NORMAL );
|
||
|
|
// if( FAILED(hr) )
|
||
|
|
// {
|
||
|
|
// // Failure. This means DDraw isn't properly installed.
|
||
|
|
// pDDraw->Release();
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// (*pdwDXVersion) = 0;
|
||
|
|
// OutputDebugString( "Couldn't Set coop level\r\n" );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// hr = pDDraw->CreateSurface( &ddsd, &pSurf, NULL );
|
||
|
|
// if( FAILED(hr) )
|
||
|
|
// {
|
||
|
|
// // Failure. This means DDraw isn't properly installed.
|
||
|
|
// pDDraw->Release();
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// *pdwDXVersion = 0;
|
||
|
|
// OutputDebugString( "Couldn't CreateSurface\r\n" );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// // Query for the IDirectDrawSurface3 interface
|
||
|
|
// if( FAILED( pSurf->QueryInterface( IID_IDirectDrawSurface3,
|
||
|
|
// (VOID**)&pSurf3 ) ) )
|
||
|
|
// {
|
||
|
|
// pDDraw->Release();
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// // QI for IDirectDrawSurface3 succeeded. We must be at least DX5
|
||
|
|
// (*pdwDXVersion) = 0x500;
|
||
|
|
|
||
|
|
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
// // DirectX 6.0 Checks
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
// // The IDirectDrawSurface4 interface was introduced with DX 6.0
|
||
|
|
// if( FAILED( pSurf->QueryInterface( IID_IDirectDrawSurface4,
|
||
|
|
// (VOID**)&pSurf4 ) ) )
|
||
|
|
// {
|
||
|
|
// pDDraw->Release();
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// // IDirectDrawSurface4 was create successfully. We must be at least DX6
|
||
|
|
// (*pdwDXVersion) = 0x600;
|
||
|
|
// pSurf->Release();
|
||
|
|
// pDDraw->Release();
|
||
|
|
|
||
|
|
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
// // DirectX 6.1 Checks
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
//// FIX: DirectMusic is deprecated.
|
||
|
|
// //// Check for DMusic, which was introduced with DX6.1
|
||
|
|
// //LPDIRECTMUSIC pDMusic = NULL;
|
||
|
|
// //CoInitialize( NULL );
|
||
|
|
// //hr = CoCreateInstance( CLSID_DirectMusic, NULL, CLSCTX_INPROC_SERVER,
|
||
|
|
// // IID_IDirectMusic, (VOID**)&pDMusic );
|
||
|
|
// //if( FAILED(hr) )
|
||
|
|
// //{
|
||
|
|
// // OutputDebugString( "Couldn't create CLSID_DirectMusic\r\n" );
|
||
|
|
// // FreeLibrary( DDHinst );
|
||
|
|
// // return;
|
||
|
|
// //}
|
||
|
|
|
||
|
|
// //// DirectMusic was created successfully. We must be at least DX6.1
|
||
|
|
// //(*pdwDXVersion) = 0x601;
|
||
|
|
// //pDMusic->Release();
|
||
|
|
// //CoUninitialize();
|
||
|
|
//
|
||
|
|
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
// // DirectX 7.0 Checks
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
// // Check for DirectX 7 by creating a DDraw7 object
|
||
|
|
// LPDIRECTDRAW7 pDD7;
|
||
|
|
// DirectDrawCreateEx = (DIRECTDRAWCREATEEX)GetProcAddress( DDHinst,
|
||
|
|
// "DirectDrawCreateEx" );
|
||
|
|
// if( NULL == DirectDrawCreateEx )
|
||
|
|
// {
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// if( FAILED( DirectDrawCreateEx( NULL, (VOID**)&pDD7, IID_IDirectDraw7,
|
||
|
|
// NULL ) ) )
|
||
|
|
// {
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
// return;
|
||
|
|
// }
|
||
|
|
|
||
|
|
// // DDraw7 was created successfully. We must be at least DX7.0
|
||
|
|
// (*pdwDXVersion) = 0x700;
|
||
|
|
// pDD7->Release();
|
||
|
|
|
||
|
|
//
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
// // End of checks
|
||
|
|
// ///////////////////////////////////////////////////////////////////////////
|
||
|
|
|
||
|
|
// // Close open libraries and return
|
||
|
|
// FreeLibrary( DDHinst );
|
||
|
|
//
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
int getDXVersion(){
|
||
|
|
DWORD version,platform;
|
||
|
|
|
||
|
|
GetDXVersion( &version,&platform );
|
||
|
|
|
||
|
|
return (version>>8)&0xff;
|
||
|
|
}
|
||
|
|
|