下面的这段代码是获取DX的版本号,如果版本大于等于9,返回TRUE,小于9返回FALSE。
BOOL GetVersionDirectX()
{
BOOL bResult = FALSE;
HRESULT hr;
//HRESULT hr;
IDxDiagContainer* pObject = NULL;
IDxDiagContainer* pDxDiagRoot = NULL;
IDxDiagProvider* pDxDiagProvider = NULL;
CoInitialize( NULL );
hr = CoCreateInstance( CLSID_DxDiagProvider,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDxDiagProvider,
(LPVOID*) &pDxDiagProvider);
DXDIAG_INIT_PARAMS dxDiagInitParam;
ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) );
dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS);
dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION;
dxDiagInitParam.bAllowWHQLChecks = TRUE;
dxDiagInitParam.pReserved = NULL;
hr = pDxDiagProvider->Initialize( &dxDiagInitParam );
hr = pDxDiagProvider->GetRootContainer( &pDxDiagRoot );
TCHAR szDirectXVersionLongEnglish[100];
hr = pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pObject );
if( FAILED( hr ) || pObject == NULL )
{
AfxMessageBox("fg");
}
//hr = GetStringValue( pObject, L"dwDirectXVersionMajor", EXPAND(szDirectXVersionLongEnglish) );
DWORD dwDirectXVersionMajor = 0 ;
hr = GetUIntValue( pObject, L"dwDirectXVersionMajor", &dwDirectXVersionMajor );
//::AfxMessageBox(szDirectXVersionLongEnglish);
CString strVersion;
strVersion.Format("%d",dwDirectXVersionMajor);
//strVersion.Find("DirectX");
if(dwDirectXVersionMajor >= 9)
{
bResult = TRUE;
}
return bResult;
} 
对比下面的代码,你发现问题了吗? 你有写过类似上面的代码吗?
BOOL GetVersionDirectX()
{
BOOL bResult = FALSE;
HRESULT hr;
//HRESULT hr;
IDxDiagContainer* pObject = NULL;
IDxDiagContainer* pDxDiagRoot = NULL;
IDxDiagProvider* pDxDiagProvider = NULL;
CoInitialize( NULL );
hr = CoCreateInstance( CLSID_DxDiagProvider,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDxDiagProvider,
(LPVOID*) &pDxDiagProvider);
if(FAILED( hr ))
{
CoUninitialize();
return bResult;
}
DXDIAG_INIT_PARAMS dxDiagInitParam;
ZeroMemory( &dxDiagInitParam, sizeof(DXDIAG_INIT_PARAMS) );
dxDiagInitParam.dwSize = sizeof(DXDIAG_INIT_PARAMS);
dxDiagInitParam.dwDxDiagHeaderVersion = DXDIAG_DX9_SDK_VERSION;
dxDiagInitParam.bAllowWHQLChecks = TRUE;
dxDiagInitParam.pReserved = NULL;
hr = pDxDiagProvider->Initialize( &dxDiagInitParam );
if(FAILED( hr ))
{
pDxDiagProvider->Release();
CoUninitialize();
return bResult;
}
hr = pDxDiagProvider->GetRootContainer( &pDxDiagRoot );
if(FAILED( hr ))
{
pDxDiagProvider->Release();
CoUninitialize();
return bResult;
}
TCHAR szDirectXVersionLongEnglish[100];
hr = pDxDiagRoot->GetChildContainer( L"DxDiag_SystemInfo", &pObject );
if(FAILED(hr) || pObject == NULL )
{
pDxDiagProvider->Release();
pDxDiagRoot->Release();
CoUninitialize();
return bResult;
}
//hr = GetStringValue( pObject, L"dwDirectXVersionMajor", EXPAND(szDirectXVersionLongEnglish) );
DWORD dwDirectXVersionMajor = 0 ;
hr = GetUIntValue( pObject, L"dwDirectXVersionMajor", &dwDirectXVersionMajor );
if(FAILED( hr ))
{
pObject->Release();
pDxDiagProvider->Release();
pDxDiagRoot->Release();
CoUninitialize();
return bResult;
}
//::AfxMessageBox(szDirectXVersionLongEnglish);
CString strVersion;
strVersion.Format("%d",dwDirectXVersionMajor);
//strVersion.Find("DirectX");
if(dwDirectXVersionMajor >= 9)
{
bResult = TRUE;
}
pObject->Release();
pDxDiagProvider->Release();
pDxDiagRoot->Release();
CoUninitialize();
return bResult;
}我认为一个合格的程序员的思维应该是缜密的,一些程序语言的规则一定要遵守,不应该犯有CoInitialize(NULL);而无CoUninitialize();这样的低级错误。
本文提供了一段用于检测DirectX版本的代码,并通过对比两个版本的实现,指出了其中一个版本中存在的问题,强调了程序中资源释放的重要性。
1334

被折叠的 条评论
为什么被折叠?



