2019-01-10 第一章Windows操作001

本文介绍如何使用VS2010的MFC工程,通过调用GetVolumeInformation函数获取磁盘的卷标、序列号、文件系统信息等。详细步骤包括创建MFC项目,配置字符集,利用listcontrol展示信息,以及通过API函数读取磁盘数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

001 获取驱动器的卷标

调用API函数中GetVolumeInformation来获取驱动器的卷标。备注:该函数可以获取磁盘序列号和文件系统信息。

BOOL GetVolumeInformation(LPCTSTR lpRootPathName,  //根目录的名称

                                                LPTSTR lpVolumeNameBuffer, //存放卷标名称的缓存

                                                DWORD nVolumeNameSize, //卷标名称的大小

                                                LPDWORD lpVolumeSerialNumber, //卷标的序列号

                                               LPDWORD lpMaximumComponentLength, //最大文件名长度

                                               LPDWORD lpFileSystemFlags, //文件系统标志

                                               LPTSTR lpFileSystemNameBuffer, //存放文件系统名称的缓存

                                               DWORD nFileSystemNameSize //存放文件系统名称的缓存的大小

                                               );

操作流程(vs2010):

    首先新建MFC工程,添加列表视图控件(list control )和按钮控件(button),右击项目-属性-配置属性-常规-将字符这项改为“使用多字符字符集”-应用-确认。选中窗体中list control控件-右击-属性-View改为“Report”。选中窗体中list control控件再次右击-添加变量-  m_linkList,点击button按钮进入编写, 代码如下:

 DWORD size;
 size  = ::GetLogicalDriveStrings(0, NULL); //获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径
 if (size != 0)
 {
  HANDLE heap = ::GetProcessHeap();  //是一个Windows API函数。它返回调用进程的默认堆句柄
  LPSTR lp = (LPSTR)HeapAlloc(heap, HEAP_ZERO_MEMORY, size*sizeof(TCHAR));  //是一个Windows API函数。它用来在指定的堆上分配内存,并且分配后的内存不可移动
  ::GetLogicalDriveStringsA(size*sizeof(TCHAR), lp);
  while(*lp != 0)
  {
   UINT res = ::GetDriveTypeA(lp);
   
   if (res = DRIVE_FIXED)  //=作用是将光驱盘强制设置为DRIVE_FIXED
   {
    m_linkList.InsertItem(0, lp, 0);
    lp = _tcschr(lp, 0) + 1;  //截取并返回str中字符c出现的最后一个位置开始的字符串的指针,如果没有发现返回NULL。
   }
  }
 }
 LPTSTR namebuf = new char[12];  //GetVolumeInformation函数参数定义
 DWORD namesize = 12;
 DWORD seralnumber;
 DWORD maxlen;
 DWORD fileflag;
 LPTSTR sysnamebuf = new char[10];
 DWORD sysnamesize = 10;
 int num = m_linkList.GetItemCount();
 for (int i = 0; i < num; i++)
 {
  CString str, temp;
  str = m_linkList.GetItemText(i,0);
  ::GetVolumeInformation(str, namebuf, namesize, &seralnumber,&maxlen, &fileflag, sysnamebuf, sysnamesize);
  temp.Format("%s", namebuf);
  m_linkList.SetItemText(i, 1, temp);
 }

 

在OnInitDialog()函数里面添加两行,这样实现第二列纵向显示:
m_linkList.InsertColumn(0, "逻辑分区", LVCFMT_CENTER, 140, 50);
 m_linkList.InsertColumn(1, "卷标", LVCFMT_CENTER, 140, 50);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值