怎么利用VC++读取U盘物理序列号?

wuan412 2009-08-01 03:02:07
怎么读取U盘的物理序列号啊?
有一种是通过注册表 得到。
另外一种通过调用.NET的方法
能不能给一些好的办法啊
...全文
1749 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zngsai 2009-08-01
  • 打赏
  • 举报
回复
/************************************************************
//函数名称: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 CCPUIDDlg::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");
break;
case DRIVE_RAMDISK:
strDriveType = _T("RAM");
break;
default:
strResult = _T("未知错误!");
return strResult;
}
strResult.Format(_T("驱动器 %c 的类型为:%s."),bAlpha,strDriveType);
break;
default:
strResult = _T("获取驱动器信息时参数设置错误!");
break;
}

}

/**********返回所要求的驱动器的信息**********/
return strResult;
}

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧