00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "fsDirectXVersion.h"
00009 #include <basetsd.h>
00010 #include <ddraw.h>
00011 #include <dinput.h>
00012 #include <dmusici.h>
00013
00014 typedef HRESULT(WINAPI * DIRECTDRAWCREATE)( GUID*, LPDIRECTDRAW*, IUnknown* );
00015 typedef HRESULT(WINAPI * DIRECTDRAWCREATEEX)( GUID*, VOID**, REFIID, IUnknown* );
00016 typedef HRESULT(WINAPI * DIRECTINPUTCREATE)( HINSTANCE, DWORD, LPDIRECTINPUT*,
00017 IUnknown* );
00018
00019 #ifdef _DEBUG
00020 #undef THIS_FILE
00021 static char THIS_FILE[]=__FILE__;
00022 #define new DEBUG_NEW
00023 #endif
00024
00025 fsDirectXVersion::fsDirectXVersion()
00026 {
00027
00028 }
00029
00030 fsDirectXVersion::~fsDirectXVersion()
00031 {
00032
00033 }
00034
00035 DWORD fsDirectXVersion::GetCurrentVersion()
00036 {
00037 DIRECTDRAWCREATE DirectDrawCreate = NULL;
00038 DIRECTDRAWCREATEEX DirectDrawCreateEx = NULL;
00039 DIRECTINPUTCREATE DirectInputCreate = NULL;
00040 HINSTANCE hDDrawDLL = NULL;
00041 HINSTANCE hDInputDLL = NULL;
00042 HINSTANCE hD3D8DLL = NULL;
00043 LPDIRECTDRAW pDDraw = NULL;
00044 LPDIRECTDRAW2 pDDraw2 = NULL;
00045 LPDIRECTDRAWSURFACE pSurf = NULL;
00046 LPDIRECTDRAWSURFACE3 pSurf3 = NULL;
00047 LPDIRECTDRAWSURFACE4 pSurf4 = NULL;
00048 DWORD dwDXVersion = 0;
00049 HRESULT hr;
00050
00051 hDDrawDLL = LoadLibrary( "DDRAW.DLL" );
00052 if( hDDrawDLL == NULL )
00053 {
00054 dwDXVersion = 0;
00055 return dwDXVersion;
00056 }
00057
00058 DirectDrawCreate = (DIRECTDRAWCREATE)GetProcAddress( hDDrawDLL, "DirectDrawCreate" );
00059 if( DirectDrawCreate == NULL )
00060 {
00061 dwDXVersion = 0;
00062 FreeLibrary( hDDrawDLL );
00063 return dwDXVersion;
00064 }
00065
00066 hr = DirectDrawCreate( NULL, &pDDraw, NULL );
00067 if( FAILED(hr) )
00068 {
00069 dwDXVersion = 0;
00070 FreeLibrary( hDDrawDLL );
00071 return dwDXVersion;
00072 }
00073
00074 dwDXVersion = 0x100;
00075
00076 hr = pDDraw->QueryInterface( IID_IDirectDraw2, (VOID**)&pDDraw2 );
00077 if( FAILED(hr) )
00078 {
00079
00080 pDDraw->Release();
00081 FreeLibrary( hDDrawDLL );
00082 return dwDXVersion;
00083 }
00084
00085 pDDraw2->Release();
00086 dwDXVersion = 0x200;
00087
00088 hDInputDLL = LoadLibrary( "DINPUT.DLL" );
00089 if( hDInputDLL == NULL )
00090 {
00091
00092 pDDraw->Release();
00093 return dwDXVersion;
00094 }
00095
00096 DirectInputCreate = (DIRECTINPUTCREATE)GetProcAddress( hDInputDLL,
00097 "DirectInputCreateA" );
00098 if( DirectInputCreate == NULL )
00099 {
00100
00101 FreeLibrary( hDInputDLL );
00102 FreeLibrary( hDDrawDLL );
00103 pDDraw->Release();
00104 return dwDXVersion;
00105 }
00106
00107 dwDXVersion = 0x300;
00108 FreeLibrary( hDInputDLL );
00109
00110 DDSURFACEDESC ddsd;
00111 ZeroMemory( &ddsd, sizeof(ddsd) );
00112 ddsd.dwSize = sizeof(ddsd);
00113 ddsd.dwFlags = DDSD_CAPS;
00114 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
00115
00116 hr = pDDraw->SetCooperativeLevel( NULL, DDSCL_NORMAL );
00117 if( FAILED(hr) )
00118 {
00119
00120 pDDraw->Release();
00121 FreeLibrary( hDDrawDLL );
00122 dwDXVersion = 0;
00123 return dwDXVersion;
00124 }
00125
00126 hr = pDDraw->CreateSurface( &ddsd, &pSurf, NULL );
00127 if( FAILED(hr) )
00128 {
00129
00130 pDDraw->Release();
00131 FreeLibrary( hDDrawDLL );
00132 dwDXVersion = 0;
00133 return dwDXVersion;
00134 }
00135
00136 if( FAILED( pSurf->QueryInterface( IID_IDirectDrawSurface3,
00137 (VOID**)&pSurf3 ) ) )
00138 {
00139 pDDraw->Release();
00140 FreeLibrary( hDDrawDLL );
00141 return dwDXVersion;
00142 }
00143
00144 dwDXVersion = 0x500;
00145
00146 if( FAILED( pSurf->QueryInterface( IID_IDirectDrawSurface4,
00147 (VOID**)&pSurf4 ) ) )
00148 {
00149 pDDraw->Release();
00150 FreeLibrary( hDDrawDLL );
00151 return dwDXVersion;
00152 }
00153
00154 dwDXVersion = 0x600;
00155 pSurf->Release();
00156 pDDraw->Release();
00157
00158 LPDIRECTMUSIC pDMusic = NULL;
00159 CoInitialize( NULL );
00160 hr = CoCreateInstance( CLSID_DirectMusic, NULL, CLSCTX_INPROC_SERVER,
00161 IID_IDirectMusic, (VOID**)&pDMusic );
00162 if( FAILED(hr) )
00163 {
00164 FreeLibrary( hDDrawDLL );
00165 return dwDXVersion;
00166 }
00167
00168 dwDXVersion = 0x601;
00169 pDMusic->Release();
00170 CoUninitialize();
00171
00172 LPDIRECTDRAW7 pDD7;
00173 DirectDrawCreateEx = (DIRECTDRAWCREATEEX)GetProcAddress( hDDrawDLL,
00174 "DirectDrawCreateEx" );
00175 if( NULL == DirectDrawCreateEx )
00176 {
00177 FreeLibrary( hDDrawDLL );
00178 return dwDXVersion;
00179 }
00180
00181 if( FAILED( DirectDrawCreateEx( NULL, (VOID**)&pDD7, IID_IDirectDraw7,
00182 NULL ) ) )
00183 {
00184 FreeLibrary( hDDrawDLL );
00185 return dwDXVersion;
00186 }
00187
00188 dwDXVersion = 0x700;
00189 pDD7->Release();
00190
00191 hD3D8DLL = LoadLibrary( "D3D8.DLL" );
00192 if( hD3D8DLL == NULL )
00193 {
00194 FreeLibrary( hDDrawDLL );
00195 return dwDXVersion;
00196 }
00197
00198 dwDXVersion = 0x800;
00199
00200 FreeLibrary( hDDrawDLL );
00201 FreeLibrary( hD3D8DLL );
00202
00203 return dwDXVersion;
00204 }