⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hardwareinfo.cpp

📁 墨香最新私服
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	return dwDXVersion;
}

// ===================================
// Graphic Card Spec
// CASE :
//  - 弊贰侨墨靛 疙
//  - 弊贰侨墨靛 靛扼捞滚 滚傈
//  - 叼胶敲饭捞 葛靛  
//  ...
// return : 滚傈 缔磊府 4磊府甫 府畔茄促.(箭磊)
// ===================================
BOOL CHardwareInfo::GetGraphicsCardInfo(GRAPHICINFO * pGraphicInfoOut)
{
	char			szBuf[255];
	D3DDEVTYPE		d3dType = D3DDEVTYPE_HAL;
	D3DCAPS8		d3dCaps;
	LPDIRECT3D8		lpD3D;
	HRESULT			hr;
	int				nRetVer;	// 缔磊府 4磊府甫 箭磊肺 郴焊辰促.

	// D3D 按眉 掘澜 
	if( NULL == ( lpD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
	{
		AfxMessageBox("Error : Create Direct3D ");
		return FALSE;
	}

	hr = lpD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, d3dType, &d3dCaps);
	if ( FAILED(hr) )
	{
		AfxMessageBox("GetDeviceCaps Error");
        return FALSE;		
	}

	// 绢氮磐(弊贰侨 墨靛)狼 沥焊 掘扁 
	D3DADAPTER_IDENTIFIER8  Adapter;
    if( FAILED( lpD3D->GetAdapterIdentifier(0, D3DENUM_NO_WHQL_LEVEL, &Adapter) ) )
	{
		AfxMessageBox("AdapterIdentifer Error");
        return FALSE;
	}

	strcpy(pGraphicInfoOut->szChipName, Adapter.Description);

	// driver 滚傈 掘扁
	CString StrVersionInfo;
	strcpy(szBuf, Adapter.Driver);	// 滚傈 颇老 疙 掘扁
	GetDllVersion(szBuf);			// szBuf俊 滚傈沥焊甫 淬酒 柯促.

	nRetVer = GetGraphicDrvVerFromString(szBuf);

	StrVersionInfo.Format("%s (%s)", Adapter.Driver, szBuf);

	strcpy(pGraphicInfoOut->szVersion, (LPCTSTR)StrVersionInfo);
	
	// display mode 沥焊 掘扁 
	D3DDISPLAYMODE d3ddm;
    if( FAILED( lpD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, & d3ddm ) ) )
	{
		AfxMessageBox("GetAdapterDisplayMode Error");
        return FALSE;
	}

	sprintf(szBuf, "%dX%d %d Hz", d3ddm.Width, d3ddm.Height, d3ddm.RefreshRate);
	strcpy(pGraphicInfoOut->szDisplayMode, szBuf);

	// 按眉 副府令 
	lpD3D->Release();

	pGraphicInfoOut->eCardKind = IdentityGraphicCard();
	pGraphicInfoOut->dwDriverVer = nRetVer;
	return TRUE;
}

// ===================================
// Version 沥焊 缔磊府甫 舅酒柯促.
// ===================================
int	CHardwareInfo::GetGraphicDrvVerFromString( char * pszString )
{
	int		i;
	char *	pStrPos;
	int		iVersion;

	pStrPos = strstr(pszString, ".");
	for (i = 0; i < 2; i++)
	{
		++pStrPos;
		pStrPos = strstr(pStrPos, ".");
	}
	
	++pStrPos;
	iVersion = atoi((LPCTSTR)pStrPos);

	return iVersion;
}

// ====================================================
// SpecGraphicCard()
// - 绢恫 弊贰侨墨靛牢瘤 舅酒辑 沥焊甫 府畔窃.
// ====================================================
eGRAPHIC_CARD_OPTION CHardwareInfo::IdentityGraphicCard()
{
	char					szBuf[256];
	D3DDEVTYPE				d3dType = D3DDEVTYPE_HAL;
	LPDIRECT3D8				lpD3D;
	eGRAPHIC_CARD_OPTION	eFlag = NORMAL;

	// D3D 按眉 掘澜 
	if( NULL == ( lpD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
	{
		MessageBox(NULL, "Error : Create Direct3D object", NULL, MB_OK);
		return OPTION_NUM;	
	}

	// 绢氮磐(弊贰侨 墨靛)狼 沥焊 掘扁 
	D3DADAPTER_IDENTIFIER8  Adapter;
    if( FAILED( lpD3D->GetAdapterIdentifier(0, D3DENUM_NO_WHQL_LEVEL, &Adapter) ) )
	{	
		MessageBox(NULL, "AdapterIdentifer Error", NULL, MB_OK);
		
		lpD3D->Release();		
        return OPTION_NUM;
	}	

	int		i;
	char *	pString;
	bool	bRadeon8500MoreThan = FALSE;
	DWORD	dwMemKilo;
	
	dwMemKilo = SpecVidMem(NULL, NULL);
	
	switch(Adapter.VendorId)
	{
	case NVIDIA_VENTDER_ID:
		if (dwMemKilo < 30000)
			eFlag = POOR_CARD;
		else
			eFlag = NORMAL;

		goto lb_Exit;

	case ATI_VENTDER_ID:
		for (i = 0; i < 10; i++)
		{ // 箭磊啊 唱坷搁 公炼扒 八荤茄促. 
			itoa(i, szBuf, 10);
			pString = strstr(Adapter.Description, szBuf);

			if (!pString)
				continue;

			if ( strstr(Adapter.Description, "7000") || 
				 strstr(Adapter.Description, "7200") ||
				 strstr(Adapter.Description, "7500") )
			{
				 bRadeon8500MoreThan = FALSE;
				 break;
			}
			else if ( strstr(Adapter.Description, "8500") )
			{
				bRadeon8500MoreThan = TRUE;
				break;
			}
			else if ( strstr(Adapter.Description, "9000") )
			{
				bRadeon8500MoreThan = TRUE;
				break;
			}
			else if ( strstr(Adapter.Description, "9100") )		
			{
				bRadeon8500MoreThan = TRUE;
				break;
			}
			else if ( strstr(Adapter.Description, "9200") )		
			{
				bRadeon8500MoreThan = TRUE;
				break;
			}
			else if ( strstr(Adapter.Description, "9500") )		
			{
				bRadeon8500MoreThan = TRUE;
				break;
			}
			else if ( strstr(Adapter.Description, "9600") )		
			{
				bRadeon8500MoreThan = TRUE;
				break;
			}
			else if ( strstr(Adapter.Description, "9700") )		
			{
				bRadeon8500MoreThan = TRUE;
				break;
			}
			else if ( strstr(Adapter.Description, "9800") )		
			{
				bRadeon8500MoreThan = TRUE;
				break;
			}
			else if ( strstr(Adapter.Description, "VE") )		
			{
				bRadeon8500MoreThan = TRUE;
			}
			else if (dwMemKilo > 120000)
			{ // vid mem 128 捞惑 
				bRadeon8500MoreThan = TRUE;
			}
			else
			{
				bRadeon8500MoreThan = FALSE;
			}
		}

		if (bRadeon8500MoreThan)
		{
			eFlag = RADEON_7500_ABOVE;
			goto lb_Exit;
		}
		else
		{
			eFlag = RADEON_7500_UNDER;
			goto lb_Exit;
		}

		break;
	case MATROX_VENTDER_ID:
		if (dwMemKilo < 30000)
			eFlag = POOR_CARD;
		else
			eFlag = MATROX;

		goto lb_Exit;

	case VOODOO_VENDER_ID:
		eFlag = VOODOO;
		goto lb_Exit;

	default:
		if (dwMemKilo < 30000)
			eFlag = POOR_CARD;
		else
			eFlag = NORMAL;	

		goto lb_Exit;
	}

lb_Exit:
	// release object
	lpD3D->Release();	
	
	return eFlag;
}


// ===================================
// IsCompressedTextureFormatOk
//
// CASE : 拘绵 咆胶媚 瘤盔窍绰瘤 救窍绰瘤甫 舅酒咳 
// RETURN :
//			TRUE, FALSE ;	瘤盔茄促, 救茄促,
// ===================================
BOOL CHardwareInfo::IsCompressedTextureFormatSupport()
{
		BOOL					bResult = FALSE;
	LPDIRECT3D8				lpD3D;
	HRESULT					hr;

    if( NULL == ( lpD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
	{
		MessageBox(NULL, "Can't Create Direct3D object!", "Error", MB_OK);
        return FALSE;
	}

	D3DDISPLAYMODE			d3ddm;
	if( FAILED( lpD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
	{
		lpD3D->Release();
		return E_FAIL;
	}

	hr = lpD3D->CheckDeviceFormat( D3DADAPTER_DEFAULT,
                                      D3DDEVTYPE_HAL,
                                      d3ddm.Format,
                                      0,
                                      D3DRTYPE_TEXTURE,
                                      D3DFMT_DXT1);

	if (hr == D3D_OK)
	{
		bResult = TRUE;
	}

	lpD3D->Release();

	return bResult;
}

// ==============================================
// SpecVidMem
// 弊贰侨墨靛狼 厚叼坷 皋葛府樊阑 舅酒 KB 窜困肺 府畔 
// ==============================================
DWORD CHardwareInfo::SpecVidMem(char * pszVidMem, char * pszAGPMem)
{
	LPDIRECTDRAW	lpDD; 
	LPDIRECTDRAW2	lpDD2; 
	DDSCAPS2		ddsCaps; 
	DWORD			dwTotal; 
	DWORD			dwFree; 

	char			szBuf[255];

	HRESULT			hr;

    hr = DirectDrawCreate( NULL, &lpDD, NULL );
    if( FAILED(hr) )
    {
		strcpy(pszVidMem, "Can't create directdraw object!");
		return -1;
    }

    // Let's see if IID_IDirectDraw2 exists.
    hr = lpDD->QueryInterface( IID_IDirectDraw2, (VOID**)&lpDD2 );
    if( FAILED(hr) )
    {
        // No IDirectDraw2 exists... must be DX1
        lpDD->Release();

		strcpy(pszVidMem, "Can't Query IID_IDirectDraw2");
        return -1;
    }

//	DXSAMPLEFORMATENUM dsPixelFormatEnum;
	//lpDD->get

	// GET VIDEO MEMORY	
	CString	strBuf;
	DWORD dwVidMemory;
	ddsCaps.dwCaps = // 泅犁 备且 母胶 胶抛捞飘 
		DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY|DDSCAPS_LOCALVIDMEM; 
	hr = lpDD2->GetAvailableVidMem((DDSCAPS*)&ddsCaps, &dwTotal, &dwFree); 
	if (FAILED(hr)) 
	{
		
		lpDD2->Release();
		lpDD->Release();

		MessageBox(NULL, "GetAvailableVidMem", "ERROR", MB_OK);
		return -1;
	}
	
	// 傈眉 厚叼坷 皋葛府 / 荤侩啊瓷 厚叼坷 皋葛府 
	if (pszVidMem)
	{
		dwTotal = dwTotal / KILO;
		ultoa(dwTotal, szBuf, 10);
		strcpy(pszVidMem, szBuf);
		dwFree = dwFree / KILO;
		ultoa(dwFree, szBuf, 10);
		strcat(pszVidMem, " / ");
		strcat(pszVidMem, szBuf);	
	}

	dwVidMemory = dwTotal;

	// GET AGP MEMORY
	ddsCaps.dwCaps = // 泅犁 备且 母胶 胶抛捞飘 
				DDSCAPS_OFFSCREENPLAIN|DDSCAPS_VIDEOMEMORY|DDSCAPS_NONLOCALVIDMEM; 

	hr = lpDD2->GetAvailableVidMem((DDSCAPS*)&ddsCaps, &dwTotal, &dwFree); 
	if (FAILED(hr)) 
	{
		lpDD2->Release();
		lpDD->Release();

		MessageBox(NULL, "GetAvailableVidMem", "ERROR", MB_OK);
		return -1;
	}

	dwTotal = dwTotal / KILO;
	if (pszAGPMem)
	{
		ultoa(dwTotal, szBuf, 10);
		strcpy(pszAGPMem, szBuf);
	}

    // IDirectDraw2 exists. We must be at least DX2
    lpDD2->Release();
	lpDD->Release();

	return dwVidMemory;
}




void	CHardwareInfo::GetDllVersion(char * pszInOutName)
{
	//	TCHAR execFilename[_MAX_PATH];
	//	VERIFY(::GetModuleFileName(NULL, execFilename, _MAX_PATH));

	HWND hWindow = NULL;

	BYTE *block;
	DWORD FAR *translation;
	DWORD FAR *buffer;
	DWORD handle;
	UINT bytes;
	TCHAR *lpszFileName = pszInOutName;
	TCHAR name[512];
	CString szString;

	// 滚傈 沥焊狼 角力 农扁甫 啊廉柯促.
	bytes = (UINT)::GetFileVersionInfoSize( lpszFileName, &handle);

	if(bytes)
	{
		block = new BYTE[bytes];

		// 滚傈 沥焊俊 措茄 角力 喉废阑 啊廉柯促.
		if( ::GetFileVersionInfo( lpszFileName, handle, bytes, block) ) 
		{
			if( ::VerQueryValue( block, "\\VarFileInfo\\Translation", (LPVOID *)&translation,(UINT FAR *)&bytes) )
			{

				// 滚傈 沥焊
				wsprintf(name,"\\StringFileInfo\\%04x%04x\\FileVersion", 
				LOWORD(*translation), HIWORD(*translation) );

				if( ::VerQueryValue(block, name, (LPVOID *)&buffer, (UINT FAR *)&bytes) ) 
				{
					szString.Format("%s", (LPCTSTR)buffer );
				}
				else
				{
					MessageBox(hWindow,"Can't call Version Info","Version Error",MB_OK);
					PostQuitMessage(0);
				}
			
			}
			else 
			{
				MessageBox(hWindow,"Can't call Translation Type","Version Error",MB_OK);
				PostQuitMessage(0);
			}
				
		}
		else 
		{
			MessageBox(hWindow,"Can't call Version Info","Version Error",MB_OK);
			PostQuitMessage(0);
		}

		delete [] block;
	}
	else 
	{
		char temp[256];
		sprintf(temp, "Can't call FileVersionInfo Size(%s)", lpszFileName);
		MessageBox(hWindow,temp,"Version Error",MB_OK);
		//PostQuitMessage(0);
	}

	strcpy(pszInOutName, (LPCTSTR)szString );
}
//-----------------------------------------------------------------------------
// Name: DSoundEnumCallback()
// Desc: Enumeration callback called by DirectSoundEnumerate
//-----------------------------------------------------------------------------
INT_PTR CALLBACK DSoundEnumCallback( GUID* pGUID, LPSTR strDesc, LPSTR strDrvName,
                                  VOID* pContext )
{
    // Set aside static storage space for 20 audio drivers
    static GUID  AudioDriverGUIDs[20];
    static DWORD dwAudioDriverIndex = 0;

	char* pBuf;

    GUID* pTemp  = NULL;

	pBuf = (char*)pContext;


	memcpy( pBuf, strDesc, strlen(strDesc) );
/*
    if( pGUID )
    {
        if( dwAudioDriverIndex >= 20 )
            return TRUE;

        pTemp = &AudioDriverGUIDs[dwAudioDriverIndex++];
        memcpy( pTemp, pGUID, sizeof(GUID) );
    }

    HWND hSoundDeviceCombo = (HWND)pContext;

    // Add the string to the combo box
    SendMessage( hSoundDeviceCombo, CB_ADDSTRING, 
                 0, (LPARAM) (LPCTSTR) strDesc );

    // Get the index of the string in the combo box
    INT nIndex = (INT)SendMessage( hSoundDeviceCombo, CB_FINDSTRING, 
                                   0, (LPARAM) (LPCTSTR) strDesc );

    // Set the item data to a pointer to the static guid stored in AudioDriverGUIDs
    SendMessage( hSoundDeviceCombo, CB_SETITEMDATA, 
                 nIndex, (LPARAM) pTemp );
*/
    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -