196上位机VC MFC获取硬盘的序列号
196上位机VC MFC获取硬盘的序列号 功能展示 磁盘序列号,简称磁盘ID,是对磁盘进行格式化时随机产生的磁盘标识信息,是一个卷序列号。同一机器两次格式化随机产生固定格式的序列号相同几率几乎为零,因而磁盘序列号常被运用用于商业化软件进行加密使用,一些限期使用的软件,在使用期限到了之后,会要求使用者在线申请新的授权序列号(使用许可)。这种授权序列号相当一部分是采用了静态磁盘序列号结合时间产生的。安装完毕之后的软件,程序即使被非法拷贝到非初始安装环境中,也不能使用,当前全程实现磁盘序列号的获取功能,效果如图; 要点提示 磁盘序列号的获取可以用函数GetVolumeInformation()此函数主要用于获取与一个磁盘卷有关的信息 函数原型为: BOOL GetVolumeInformation( LPCTSTR lpRootPathName, LPTSTR lpVolumeNameBuffer, DWORD nVolumeNameSize, LPDWORD lpVolumeSerialNumber, LPDWORD lpMaximumComponentLength, LPDWORD lpFileSystemFlags, LPTSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize); 参数 类型及说明: lpRootPathName String,欲获取信息的那个卷的根路径 lpVolumeNameBuffer String,用于装载卷名(卷标)的一个字串 nVolumeNameSize Long,lpVolumeNameBuffer字串的长度 lpVolumeSerialNumber Long,用于装载磁盘卷序列号的变量 lpMaximumComponentLength Long,指定一个变量,用于装载文件名每一部分的长度。例如,在“c:\component1\component2.ext”的情况下,它就代表component1或component2名称的长度 lpFileSystemFlags Long,用于装载一个或多个二进制位标志的变量。对这些标志位的解释如下: FS_CASE_IS_PRESERVED 文件名的大小写记录于文件系统 FS_CASE_SENSITIVE 文件名要区分大小写 FS_UNICODE_STORED_ON_DISK 文件名保存为Unicode格式 FS_PERSISTANT_ACLS 文件系统支持文件的访问控制列表(ACL)安全机制 FS_FILE_COMPRESSION 文件系统支持逐文件的进行文件压缩 FS_VOL_IS_COMPRESSED 整个磁盘卷都是压缩的 lpFileSystemNameBuffer String,指定一个缓冲区,用于装载文件系统的名称(如FAT,NTFS以及其他) nFileSystemNameSize Long,lpFileSystemNameBuffer字串的长度 返回值 BOOL,非零表示成功,零表示失败。可以用函数GetLastError()获取相关错误代码; 实现功能 1.新建基于对话框的应用程序 2.拖拽一列表控件ID为IDC_LIST1,在主对话框中初始化函数OnInitDialog()中添加代码,实现磁盘大小获取功能 - CListCtrl *pListCtrl = (CListCtrl *)GetDlgItem(IDC_LIST1);//列表控件的指针
- pListCtrl->SetExtendedStyle(LVS_EX_GRIDLINES);//网格属性
- pListCtrl->ModifyStyle(0,LVS_REPORT);//报表属性
- pListCtrl->InsertColumn(0,"磁盘驱动器",LVCFMT_LEFT,150);
- pListCtrl->InsertColumn(1,"驱动器大小",LVCFMT_LEFT,150);
- m_Imglist.Create(16,16,ILC_COLOR32|ILC_MASK,0,0);
- m_Imglist.Add(::AfxGetApp()->LoadIcon(IDI_ICON1));
- pListCtrl->SetImageList(&m_Imglist,LVSIL_SMALL);
- //<>//插入盘符
- DWORD size=::GetLogicalDriveStrings(0,NULL);
- if(size!=0)
- {
- HANDLE heap=::GetProcessHeap();
- LPSTR lp=(LPSTR)HeapAlloc(heap,HEAP_ZERO_MEMORY,size*sizeof(TCHAR));
- ::GetLogicalDriveStrings(size*sizeof(TCHAR),lp);
- while(*lp!=0)
- {
- pListCtrl->InsertItem(0,lp,0);
- lp=_tcschr(lp,0)+1;
- }
- }
-
复制代码- //<>获得磁盘序列
- LPTSTR namebuf=new char[MAX_PATH];
- DWORD serialnumber;
- DWORD maxlen;
- DWORD fileflag;
- LPTSTR sysnamebuf=new char[MAX_PATH];
- CString str,temp;
- int num=pListCtrl->GetItemCount();
- for(int i=0;i<num;i++)
- {
- str=pListCtrl->GetItemText(i,0);
- if(::GetVolumeInformation(str,namebuf,MAX_PATH,&serialnumber,&maxlen,&fileflag,sysnamebuf,MAX_PATH) )
- {
- temp.Format("%x",serialnumber);
- pListCtrl->SetItemText(i,1,temp);
- }
- }
- delete namebuf;
- delete sysnamebuf;
复制代码m_Imglist为自定义添加的CImageList类型变量,IDI_ICON1为磁盘用图标 我们来演示下功能实现的整个过程
|