你是合格的程序员吗?(一)

来源:互联网 发布:微信打不开淘宝网址 编辑:程序博客网 时间:2024/05/01 04:50

下面的这段代码是获取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();这样的低级错误。

 

原创粉丝点击