VC如何获取硬件ID,CPU,硬件,网卡等 VC如何获取硬件ID,CPU,硬件,网卡等 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 参考这个:http://topic.csdn.net/t/20041009/13/3437016.html http://www.codeguru.com/system/index.shtml 不复杂SetupDiGetClassDevsSetupDiEnumDeviceInfoSetupDiGetDeviceRegistryPropertySetupDiDestroyDeviceInfoList http://download.csdn.net/source/1118204很早以前整理的,可能有些不是很正确了!含有源代码,已经做成一个DLL了,大家可以根据需要自己修改源码使用!免费、开源、绿色!含 cpu 主板 硬盘 网卡 BIOS等序列号取得 另外有加密解密的函数 CString GetMacAddress()/** 通过WMI取第一块活动网卡地址,事先需要调用过CoInitialize()初始化COM*/{ HRESULT hRes; hRes = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); if (FAILED(hRes)) return _T(""); IWbemLocator *pLoc = NULL; hRes = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc); if (FAILED(hRes)) return _T(""); IWbemServices *pSvc = NULL; hRes = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc); if (FAILED(hRes)) { pLoc->Release(); return _T(""); } hRes = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_DEFAULT); if (FAILED(hRes)) { pSvc->Release(); pLoc->Release(); return _T(""); } IEnumWbemClassObject* pEnumerator = NULL; hRes = pSvc->ExecQuery(_bstr_t(L"WQL"), _bstr_t(L"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator); if (FAILED(hRes)) { pSvc->Release(); pLoc->Release(); return _T(""); } CString szMacAddress = _T(""); while (true) { IWbemClassObject *pclsObj = NULL; ULONG uReturn = 0; hRes = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn); if (FAILED(hRes) || !uReturn) break; VARIANT vtProp; VariantInit(&vtProp); if (SUCCEEDED(pclsObj->Get(L"MACAddress", 0, &vtProp, 0, 0))) { if (V_VT(&vtProp) == VT_BSTR) { szMacAddress = vtProp.bstrVal; VariantClear(&vtProp); pclsObj->Release(); break; } VariantClear(&vtProp); } pclsObj->Release(); } pEnumerator->Release(); pSvc->Release(); pLoc->Release(); return szMacAddress;} 你只有DLL?没有EXE?不知能否在VISTA下检测硬盘ID?我又要建一个EXE调用DLL,如果不行又是白折腾。我已经被折腾N多次了。 还好,先看了一下代码,果然是不支持VISTA的,没有去做EXE白折腾。 SetupDiGetClassDevs SetupDiEnumDeviceInfo SetupDiGetDeviceRegistryProperty SetupDiDestroyDeviceInfoList SetupDiGetClassDevs SetupDiEnumDeviceInfo SetupDiGetDeviceRegistryProperty SetupDiDestroyDeviceInfoList 奥,那个DLL大概在02年左右整理的好像,时间太久了,应该是不支持vsita的,楼主看看这段代码是否有用?我是拷贝来的:/************************************************************ //函数名称:GetDriverInfomation //函数功能:得到驱动器的信息 //参数1:bAlpha - BYTE型,驱动器的代号A-Z(a-z) //参数2:iGTI_TYPE - int,将要获取的驱动器信息类型 // GDI_VOLUMENAME 得到驱动器名字 // GDI_VOLUMESERIALNUMBER 得到驱动器序列号 // GDI_VOLUMEFILESYSTEM 得到驱动器文件系统 // GDI_VOLUMETYPE 得到驱动器类型 // GDI_VOLUMESIZE 得到驱动器总大小 // GDI_VOLUMEFREESIZE 得到驱动器剩余大小 //返回值:CString型,所要得到的驱动器信息的字符串表达 //例子:得到C盘的名字GetDriverInfomation('C',GDI_VOLUMENAME) ************************************************************/ #define GDI_VOLUMENAME 0 #define GDI_VOLUMESERIALNUMBER 1 #define GDI_VOLUMEFILESYSTEM 2 #define GDI_VOLUMETYPE 3 #define GDI_VOLUMESIZE 4 #define GDI_VOLUMEFREESIZE 5 CString GetDriverInfomation(BYTE bAlpha,int iGTI_TYPE) { CString strResult = _T(""); if(!::IsCharAlpha((TCHAR)bAlpha)) { strResult = _T("驱动器参数无效!"); return strResult; } else { /**********获取驱动器名字、序列号和文件系统部分**********/ CString strRootPathName; strRootPathName.Format(_T("%c:\\"),bAlpha); LPCTSTR lpRootPathName = strRootPathName; LPTSTR lpVolumeNameBuffer = new char[_MAX_FNAME]; DWORD nVolumeNameSize = _MAX_FNAME; DWORD nVolumeSerialNumber = 0;//便于驱动器无效时做判断 DWORD nMaximumComponentLength; DWORD nFileSystemFlags; LPTSTR lpFileSystemNameBuffer = new char[20];//文件系统(NTFS,FAT)多大有定义好的宏吗 DWORD nFileSystemNameSize = 20; GetVolumeInformation( lpRootPathName, lpVolumeNameBuffer, nVolumeNameSize, &nVolumeSerialNumber, &nMaximumComponentLength, &nFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize); /**********获取驱动器类型部分**********/ CString strDriveType; /**********获取驱动器总大小和剩余大小部分**********/ LPCTSTR lpDirectoryName = new char[2]; lpDirectoryName = (LPCTSTR)strRootPathName.Mid(0,2); _ULARGE_INTEGER FreeBytesAvailable,TotalNumberOfBytes,TotalNumberOfFreeBytes ; __int64 iVolumeSize = 0,iVolumeFreeSize = 0; GetDiskFreeSpaceEx(strRootPathName.Mid(0,2),&FreeBytesAvailable,&TotalNumberOfBytes,&TotalNumberOfFreeBytes ); iVolumeSize = TotalNumberOfBytes.QuadPart / 1024 / 1024; iVolumeFreeSize = FreeBytesAvailable.QuadPart / 1024 / 1024; /**********根据参数得出响应的驱动器信息**********/ switch(iGTI_TYPE) { case GDI_VOLUMENAME: if (lpVolumeNameBuffer != NULL) strResult.Format(_T("驱动器 %c 的名字为:%s."),bAlpha,lpVolumeNameBuffer); else strResult.Format(_T("驱动器 %c 的名字为:%s."),bAlpha,lpVolumeNameBuffer); //strResult.Format(_T("获取驱动器名字失败!")); break; case GDI_VOLUMESERIALNUMBER: if (nVolumeSerialNumber != 0) strResult.Format(_T("驱动器 %c 的序列号为:%X."),bAlpha,nVolumeSerialNumber); else strResult.Format(_T("获取驱动器序列号失败!")); break; case GDI_VOLUMEFILESYSTEM: if (lpFileSystemNameBuffer != NULL) strResult.Format(_T("驱动器 %c 的文件系统为:%s."),bAlpha,lpFileSystemNameBuffer); else strResult.Format(_T("获取驱动器文件系统失败!")); break; case GDI_VOLUMESIZE: if (iVolumeSize != 0) strResult.Format(_T("驱动器 %c 的总大小为:%.2fGB."),bAlpha,(float)iVolumeSize/1024); else strResult.Format(_T("获取驱动器总大小失败!")); break; case GDI_VOLUMEFREESIZE: if (iVolumeFreeSize != 0) strResult.Format(_T("驱动器 %c 的剩余大小为:%.2fGB."),bAlpha,(float)iVolumeFreeSize/1024); else strResult.Format(_T("获取驱动器剩余大小失败!")); break; case GDI_VOLUMETYPE: switch(GetDriveType(lpRootPathName)) { case DRIVE_UNKNOWN: strDriveType = _T("未知类型!"); break; case DRIVE_NO_ROOT_DIR: strResult = _T("没有根目录的驱动器!"); return strResult; case DRIVE_REMOVABLE: strDriveType = _T("可移动磁盘"); break; case DRIVE_FIXED: strDriveType = _T("硬盘"); break; case DRIVE_REMOTE: strDriveType = _T("网络驱动器"); break; case DRIVE_CDROM: strDriveType = _T("光驱(CD-ROM)"); break; case DRIVE_RAMDISK: strDriveType = _T("RAM磁盘(RAM Disk)"); break; default: strResult = _T("未知错误!"); return strResult; } strResult.Format(_T("驱动器 %c 的类型为:%s."),bAlpha,strDriveType); break; default: strResult = _T("获取驱动器信息时参数设置错误!"); break; } } /**********返回所要求的驱动器的信息**********/ return strResult; }具体是那位大侠写的忘记了,汗!另外没有验证,楼主自己试试吧! 参考这个:http://topic.csdn.net/t/20041009/13/3437016.html SetupDiGetClassDevs SetupDiEnumDeviceInfo SetupDiGetDeviceRegistryProperty SetupDiDestroyDeviceInfoList 参考这个:http://topic.csdn.net/t/20041009/13/3437016.html 不复杂 SetupDiGetClassDevs SetupDiEnumDeviceInfo SetupDiGetDeviceRegistryProperty SetupDiDestroyDeviceInfoList用这样函数就行 SetupDiGetClassDevs SetupDiEnumDeviceInfo SetupDiGetDeviceRegistryProperty SetupDiDestroyDeviceInfoList SetupDiGetClassDevs SetupDiEnumDeviceInfo SetupDiGetDeviceRegistryProperty SetupDiDestroyDeviceInfoList看过留名,虽然我是什么都看不懂 恩,留个脚步,以备后用! 每天回帖即可获得10分可用分 heihei O(∩_∩)O~ http://topic.csdn.net/t/20041009/13/3437016.html 查看系统的API 都有专门的函数的 it's a typical question to retrieve the hardware information, there's much related source code about that, you can get from internet. UP UP UP UP UP UP UP 很早以前整理的,可能有些不是很正确了!含有源代码,已经做成一个DLL了,大家可以根据需要自己修改源码使用!免费、开源、绿色! 含 cpu 主板 硬盘 网卡 BIOS等序列号取得 另外有加密解密的函数 XUE XI LE ,DENG YONG SHI ZAI KAN 想请教各位,开发winsock程序的思路是什么? 请教状态检测防火墙的设计 如何不使键盘FOUCUS到滚动条? 请问在列表框中怎么插入子项? 关于ACTIVEX控件的初始化 如何在对话框中实现上下滚动条呀? ????如何判断字符串中的汉字和普通字符,在线等待,谢谢???? 谁帮我编写个注入用的DLL文件,我谢谢他!! 为什么网上下的VC程序,在我VS2012中自己编一遍,就运行不了? 我做了一个向导,可属性单PropertySheet的左上角有一个兰色的圆,应该是个bitmap吧,怎样去掉?help 视频传输 H263解码 雪花 关于网络通信编程的改进?
SetupDiGetClassDevs
SetupDiEnumDeviceInfo
SetupDiGetDeviceRegistryProperty
SetupDiDestroyDeviceInfoList
含 cpu 主板 硬盘 网卡 BIOS等序列号取得 另外有加密解密的函数
/*
* 通过WMI取第一块活动网卡地址,事先需要调用过CoInitialize()初始化COM
*/
{
HRESULT hRes; hRes = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT,
RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
if (FAILED(hRes))
return _T(""); IWbemLocator *pLoc = NULL;
hRes = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
if (FAILED(hRes))
return _T(""); IWbemServices *pSvc = NULL;
hRes = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0,
NULL, 0, 0, &pSvc);
if (FAILED(hRes))
{
pLoc->Release();
return _T("");
} hRes = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_DEFAULT);
if (FAILED(hRes))
{
pSvc->Release();
pLoc->Release();
return _T("");
} IEnumWbemClassObject* pEnumerator = NULL;
hRes = pSvc->ExecQuery(_bstr_t(L"WQL"),
_bstr_t(L"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = TRUE"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL, &pEnumerator);
if (FAILED(hRes))
{
pSvc->Release();
pLoc->Release();
return _T("");
} CString szMacAddress = _T("");
while (true)
{
IWbemClassObject *pclsObj = NULL;
ULONG uReturn = 0; hRes = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (FAILED(hRes) || !uReturn)
break; VARIANT vtProp;
VariantInit(&vtProp);
if (SUCCEEDED(pclsObj->Get(L"MACAddress", 0, &vtProp, 0, 0)))
{
if (V_VT(&vtProp) == VT_BSTR)
{
szMacAddress = vtProp.bstrVal;
VariantClear(&vtProp);
pclsObj->Release();
break;
}
VariantClear(&vtProp);
}
pclsObj->Release();
} pEnumerator->Release();
pSvc->Release();
pLoc->Release(); return szMacAddress;
}
你只有DLL?没有EXE?
不知能否在VISTA下检测硬盘ID?
我又要建一个EXE调用DLL,如果不行又是白折腾。
我已经被折腾N多次了。
还好,先看了一下代码,果然是不支持VISTA的,没有去做EXE白折腾。
SetupDiEnumDeviceInfo
SetupDiGetDeviceRegistryProperty
SetupDiDestroyDeviceInfoList
SetupDiEnumDeviceInfo
SetupDiGetDeviceRegistryProperty
SetupDiDestroyDeviceInfoList
/************************************************************
//函数名称:GetDriverInfomation
//函数功能:得到驱动器的信息
//参数1:bAlpha - BYTE型,驱动器的代号A-Z(a-z)
//参数2:iGTI_TYPE - int,将要获取的驱动器信息类型
// GDI_VOLUMENAME 得到驱动器名字
// GDI_VOLUMESERIALNUMBER 得到驱动器序列号
// GDI_VOLUMEFILESYSTEM 得到驱动器文件系统
// GDI_VOLUMETYPE 得到驱动器类型
// GDI_VOLUMESIZE 得到驱动器总大小
// GDI_VOLUMEFREESIZE 得到驱动器剩余大小
//返回值:CString型,所要得到的驱动器信息的字符串表达
//例子:得到C盘的名字GetDriverInfomation('C',GDI_VOLUMENAME)
************************************************************/
#define GDI_VOLUMENAME 0
#define GDI_VOLUMESERIALNUMBER 1
#define GDI_VOLUMEFILESYSTEM 2
#define GDI_VOLUMETYPE 3
#define GDI_VOLUMESIZE 4
#define GDI_VOLUMEFREESIZE 5
CString GetDriverInfomation(BYTE bAlpha,int iGTI_TYPE)
{
CString strResult = _T(""); if(!::IsCharAlpha((TCHAR)bAlpha))
{
strResult = _T("驱动器参数无效!");
return strResult;
}
else
{
/**********获取驱动器名字、序列号和文件系统部分**********/
CString strRootPathName;
strRootPathName.Format(_T("%c:\\"),bAlpha);
LPCTSTR lpRootPathName = strRootPathName;
LPTSTR lpVolumeNameBuffer = new char[_MAX_FNAME];
DWORD nVolumeNameSize = _MAX_FNAME;
DWORD nVolumeSerialNumber = 0;//便于驱动器无效时做判断
DWORD nMaximumComponentLength;
DWORD nFileSystemFlags;
LPTSTR lpFileSystemNameBuffer = new char[20];//文件系统(NTFS,FAT)多大有定义好的宏吗
DWORD nFileSystemNameSize = 20;
GetVolumeInformation(
lpRootPathName,
lpVolumeNameBuffer,
nVolumeNameSize,
&nVolumeSerialNumber,
&nMaximumComponentLength,
&nFileSystemFlags,
lpFileSystemNameBuffer,
nFileSystemNameSize); /**********获取驱动器类型部分**********/
CString strDriveType; /**********获取驱动器总大小和剩余大小部分**********/
LPCTSTR lpDirectoryName = new char[2];
lpDirectoryName = (LPCTSTR)strRootPathName.Mid(0,2);
_ULARGE_INTEGER FreeBytesAvailable,TotalNumberOfBytes,TotalNumberOfFreeBytes ; __int64 iVolumeSize = 0,iVolumeFreeSize = 0; GetDiskFreeSpaceEx(strRootPathName.Mid(0,2),&FreeBytesAvailable,&TotalNumberOfBytes,&TotalNumberOfFreeBytes );
iVolumeSize = TotalNumberOfBytes.QuadPart / 1024 / 1024;
iVolumeFreeSize = FreeBytesAvailable.QuadPart / 1024 / 1024; /**********根据参数得出响应的驱动器信息**********/
switch(iGTI_TYPE)
{
case GDI_VOLUMENAME:
if (lpVolumeNameBuffer != NULL)
strResult.Format(_T("驱动器 %c 的名字为:%s."),bAlpha,lpVolumeNameBuffer);
else
strResult.Format(_T("驱动器 %c 的名字为:%s."),bAlpha,lpVolumeNameBuffer);
//strResult.Format(_T("获取驱动器名字失败!"));
break;
case GDI_VOLUMESERIALNUMBER:
if (nVolumeSerialNumber != 0)
strResult.Format(_T("驱动器 %c 的序列号为:%X."),bAlpha,nVolumeSerialNumber);
else
strResult.Format(_T("获取驱动器序列号失败!"));
break;
case GDI_VOLUMEFILESYSTEM:
if (lpFileSystemNameBuffer != NULL)
strResult.Format(_T("驱动器 %c 的文件系统为:%s."),bAlpha,lpFileSystemNameBuffer);
else
strResult.Format(_T("获取驱动器文件系统失败!"));
break;
case GDI_VOLUMESIZE:
if (iVolumeSize != 0)
strResult.Format(_T("驱动器 %c 的总大小为:%.2fGB."),bAlpha,(float)iVolumeSize/1024);
else
strResult.Format(_T("获取驱动器总大小失败!"));
break;
case GDI_VOLUMEFREESIZE:
if (iVolumeFreeSize != 0)
strResult.Format(_T("驱动器 %c 的剩余大小为:%.2fGB."),bAlpha,(float)iVolumeFreeSize/1024);
else
strResult.Format(_T("获取驱动器剩余大小失败!"));
break;
case GDI_VOLUMETYPE:
switch(GetDriveType(lpRootPathName))
{
case DRIVE_UNKNOWN:
strDriveType = _T("未知类型!");
break;
case DRIVE_NO_ROOT_DIR:
strResult = _T("没有根目录的驱动器!");
return strResult;
case DRIVE_REMOVABLE:
strDriveType = _T("可移动磁盘");
break;
case DRIVE_FIXED:
strDriveType = _T("硬盘");
break;
case DRIVE_REMOTE:
strDriveType = _T("网络驱动器");
break;
case DRIVE_CDROM:
strDriveType = _T("光驱(CD-ROM)");
break;
case DRIVE_RAMDISK:
strDriveType = _T("RAM磁盘(RAM Disk)");
break;
default:
strResult = _T("未知错误!");
return strResult;
}
strResult.Format(_T("驱动器 %c 的类型为:%s."),bAlpha,strDriveType);
break;
default:
strResult = _T("获取驱动器信息时参数设置错误!");
break;
} } /**********返回所要求的驱动器的信息**********/
return strResult;
}具体是那位大侠写的忘记了,汗!另外没有验证,楼主自己试试吧!
SetupDiEnumDeviceInfo
SetupDiGetDeviceRegistryProperty
SetupDiDestroyDeviceInfoList
SetupDiGetClassDevs
SetupDiEnumDeviceInfo
SetupDiGetDeviceRegistryProperty
SetupDiDestroyDeviceInfoList用这样函数就行
SetupDiEnumDeviceInfo
SetupDiGetDeviceRegistryProperty
SetupDiDestroyDeviceInfoList
SetupDiEnumDeviceInfo
SetupDiGetDeviceRegistryProperty
SetupDiDestroyDeviceInfoList
看过留名,虽然我是什么都看不懂
含 cpu 主板 硬盘 网卡 BIOS等序列号取得 另外有加密解密的函数