📄 hardwareinfo.cpp
字号:
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 + -