国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用VB獲得大容量硬盤信息

2019-11-18 17:53:50
字體:
來源:轉載
供稿:網友
這是為什么呢?熟悉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的分區的大小,不知這輩子能否用上這么大的硬盤.

->


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 咸阳市| 隆林| 武邑县| 砀山县| 门头沟区| 盖州市| 泸西县| 伊金霍洛旗| 富宁县| 深圳市| 云龙县| 汉源县| 冷水江市| 巴林左旗| 临桂县| 麻城市| 灌阳县| 凌海市| 巍山| 昭苏县| 平罗县| 阆中市| 龙岩市| 许昌县| 交城县| 上林县| 宁蒗| 天长市| 普格县| 湾仔区| 安阳县| 太白县| 施秉县| 江川县| 元朗区| 修武县| 白朗县| 磴口县| 大理市| 承德县| 青神县|