用VB获得大容量硬盘信息_VB.net_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

用VB获得大容量硬盘信息

作者:黑客防线网安VB教程基地 来源:黑客防线网安VB教程基地 浏览次数:0

本篇关键词:信息硬盘获得函数
黑客防线网安网讯:这是为什么呢?熟悉Win32API编程的人都知道,在用VB编程时,我们可以用相应的API函数来获得有关系统的硬盘的信息,会不会是错在API的调用函数呢?想到这里我用自编的程序来查看PCAlert的有关...
这是为什么呢?熟悉Win32API编程的人都知道在用VB编程我们可以用相应的API函数来获得有关系统的硬盘的信息,会不会是错在API的调用函数呢?想到这里我用自编的程序来查看PCAlert的有关文件,发现其调用了GetDiskFreeSpace函数,问题就出在这个函数上下面是该函数的参数说明:ByvallpRootPathNameAsString(为欲查看的分区的根路径如C:),lpSectorsPerClusterAsLong(为一簇的扇区数),lpBytesPerSectorAsLong(为每一扇区的字节数),lpNumberOfFreeClustersAsLong(当前分区中未使用的簇数),lpTotalNumberOfClustersAsLong(总的簇数)AsLong当我们调用此函数时,是以lpBytesPerSector×lpSectorsPerCluster×TotalNumberOfClusters来计算分区总的大小的,在VB中我用来查看自己的C盘时返回值分别为512、64、65526,因而计算出的C盘的大小只有2.05G。

  以下是关于MSDN中的有关详细说明:对于大于的2G分区,GetDiskFreeSpace函数可能(什么可能,是一定!)返回错误的值,此时函数会屏蔽存在lpNumberOfFreeClusters及lpTotalNumberOfClusters中的值,因此建议不要用该函数来获得大于2G分区的信息。对于大于2G的分区应当使用GetDiskFreeSpaceEx函数(从Win95OEMOSR2开始),此函数可以返回分区的有关正确信息。

  找到了问题所在便可以对症下药了,即用GetDiskFreeSpaceEx函数代替GetDiskFreeSpace函数即可。以下是GetDiskFreeSpaceEx函数中所要传递增的参数

 lpRootPathNameString ,不包括卷名的磁盘根路径名
  lpFreeBytesAvailableToCallerLARGE_INTEGER,指定一个变量,用于容纳调用者可用的字节数量
  lpTotalNumberOfBytesLARGE_INTEGER ,指定一个变量,用于容纳磁盘上的总字节数
  lpTotalNumberOfFreeBytesLARGE_INTEGER,指定一个变量,用于容纳磁盘上可用的字节数

PrivateTypeLARGE_INTEGER
   lowpartAsLong
   highpartAsLong
  EndType

  我们可以看到LARGE_INTEGER是一个由两个long型组成的一个类型,两个long组成表示的都是无符号的数,在转换时应当定义一个single型的变量,使其等于highpart*(2^32-1) lowpart,注意此处的两个long型相当于C/C 中的无符号型整数类型,因为在VB中不存在此种类型,故而在换算时要处理好转换关系。我本人的做法是首先判断long型变量的正负,如是正直接相乘,如是负则用2^32-1减去该值再相乘(具体算法详见下面的代码)。

OptionExplicit
  PrivateTypeLARGE_INTEGER
   lowpartAsLong
   highpartAsLong
  EndType

PrivateDeclareFunctionGetDiskFreeSpaceLib"kernel32"Alias"GetDiskFreeSpaceA"(ByVallpRootPathNameAsString,lpSectorsPerClusterAsLong,lpBytesPerSectorAsLong,lpNumberOfFreeClustersAsLong,lpTotalNumberOfClustersAsLong)AsLong

PrivateDeclareFunctionGetDiskFreeSpaceExLib"kernel32"Alias"GetDiskFreeSpaceExA"_
  (ByVallpRootPathNameAsString,lpFreeBytesAvailableToCallerAsLARGE_INTEGER,_
  lpTotalNumberOfBytesAsLARGE_INTEGER,lpTotalNumberOfFreeBytes_
  AsLARGE_INTEGER)AsLong

PrivateSubCommand1_Click()
   DimlngSectors&
   DimlngTotalCluster&
   DimlngFreeCluster&
   DimlngPerCluster&
   DimlngperBytes&
   DimlngSize#
   GetDiskFreeSpace"c:",lngPerCluster,lngperBytes,lngFreeCluster,lngTotalCluster

 MsgBoxCStr(lngTotalCluster*lngperBytes*lngPerCluster)
   Debug.PrintlngTotalCluster,lngperBytes,lngPerCluster
  EndSub

PrivateTypeLARGE_INTEGER
   lowpartAsLong
   highpartAsLong
  EndType
  PrivateDeclareFunctionGetDiskFreeSpaceLib"kernel32"Alias"GetDiskFreeSpaceA"(ByVallpRootPathNameAsString,lpSectorsPerClusterAsLong,lpBytesPerSectorAsLong,lpNumberOfFreeClustersAsLong,lpTotalNumberOfClustersAsLong)AsLong

PrivateDeclareFunctionGetDiskFreeSpaceExLib"kernel32"Alias"GetDiskFreeSpaceExA"_
  (ByVallpRootPathNameAsString,lpFreeBytesAvailableToCallerAsLARGE_INTEGER,_
  lpTotalNumberOfBytesAsLARGE_INTEGER,lpTotalNumberOfFreeBytes_
  AsLARGE_INTEGER)AsLong

PrivateSubCommand1_Click()
  注释:用GetDiskFreeSpace得到错误的容量
   DimlngSectors&
   DimlngTotalCluster&
   DimlngFreeCluster&
   DimlngPerCluster&
   DimlngperBytes&
   DimlngSize#
   GetDiskFreeSpace"c:",lngPerCluster,lngperBytes,lngFreeCluster,lngTotalCluster

 MsgBoxCStr(lngTotalCluster*lngperBytes*lngPerCluster)
  EndSub

PrivateSubcmdStart_Click()
  注释:用GetDiskFreeSpaceEx得到正确的容量
   DimlngFreeCallerAsLARGE_INTEGER
   DimlngTotalAsLARGE_INTEGER
   DimlngTotalFreeAsLARGE_INTEGER
   DimsngSize#

 GetDiskFreeSpaceEx"c:",lngFreeCaller,lngTotal,lngTotalFree
  注释:以下用来显示出分区总容量(以G为单位)
   MsgBoxGetSize(lngTotal)/2^30
  EndSub

PrivateFunctionGetSize(lngSizeAsLARGE_INTEGER)AsSingle

注释:用来从LARGE_INTEGER型变量中换算出实际的大小
  WithlngSize
   If.highpart<0Then
  GetSize=(2^32-1-.highpart)*(2^32-1)
   Else
  GetSize=.highpart*(2^32-1)
   EndIf
   If.lowpart<0Then
  GetSize=GetSize (2^32-1-.lowpart)
   Else
  GetSize=GetSize .lowpart
   EndIf
  EndWith
  EndFunction

PrivateFunctionGetSize(lngSizeAsLARGE_INTEGER)AsSingle

 注释:用来从LARGE_INTEGER型变量中换算出实际的大小
   WithlngSize
  If.highpart<0Then
   GetSize=(2^32-1-.highpart)*(2^32-1)
  Else
   GetSize=.highpart*(2^32-1)
  EndIf
  If.lowpart<0Then
   GetSize=GetSize (2^32-1-.lowpart)
  Else
   GetSize=GetSize .lowpart
  EndIf
   EndWith
  EndFunction
  

  从LARGE_INTEGER的定义来看,应用此函数理论上可得到2^64/2^30=2^34G的分区的大小,不知这辈子能否用上这么大的硬盘.

->

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-14596-1.html
网站维护教程更新时间:2012-04-03 01:10:16  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer