日本国产亚洲-日本国产一区-日本国产一区二区三区-日本韩国欧美一区-日本韩国欧美在线-日本韩国欧美在线观看

當前位置:雨林木風下載站 > 技術(shù)開發(fā)教程 > 詳細頁面

用VB獲得大容量硬盤信息

用VB獲得大容量硬盤信息

更新時間:2019-09-02 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

我的愛機用的是MSI(微星)經(jīng)典的6309的板子(694X芯片),在主板的隨機光盤上,有一個非常不錯的PC Alert System Monitor系統(tǒng)工具,它不僅可以用來測CPU的溫度、電壓、顯卡的溫度等,還可以顯示當前系統(tǒng)的一些信息(安裝后該程序可以自動執(zhí)行,對機器進行實時的監(jiān)控)。一天剛剛下網(wǎng),無聊之際打開了該工具查看自己的硬盤信息(在Win98下),我的硬盤是西部數(shù)據(jù)(Western Digital)20.5G的,其分區(qū)情況如下:C:4.0G(用來裝Win98)、D:4.0G(用于Win2000)、E:5.0G(數(shù)據(jù))、F:5.0G(數(shù)據(jù))、G:剩余的容量(用于備份)。可是在顯示時卻出現(xiàn)這樣的信息:C:D:E:F:盤的大小變成了2.05G(到后面可以知道只要分區(qū)大于2G的都不會顯示正常的大。。

  這是為什么呢?熟悉Win32 API編程的人都知道,在用VB編程時,我們可以用相應的API函數(shù)來獲得有關(guān)系統(tǒng)的硬盤的信息,會不會是錯在API的調(diào)用函數(shù)呢?想到這里我用自編的程序來查看PC Alert的有關(guān)文件,發(fā)現(xiàn)其調(diào)用了GetDiskFreeSpace函數(shù),問題就出在這個函數(shù)上。下面是該函數(shù)的參數(shù)說明:Byval lpRootPathName As String(為欲查看的分區(qū)的根路徑如C:\) ,lpSectorsPerCluster As Long(為一簇的扇區(qū)數(shù)), lpBytesPerSector As Long(為每一扇區(qū)的字節(jié)數(shù)), lpNumberOfFreeClusters As Long(當前分區(qū)中未使用的簇數(shù)), lpTotalNumberOfClusters As Long(總的簇數(shù)) As Long。當我們調(diào)用此函數(shù)時,是以lpBytesPerSector×lpSectorsPerCluster×TotalNumberOfClusters來計算分區(qū)總的大小的,在VB中我用來查看自己的C盤時返回值分別為512 、64、 65526,因而計算出的C盤的大小只有2.05G。

  以下是關(guān)于MSDN中的有關(guān)詳細說明:對于大于的2G分區(qū),GetDiskFreeSpace函數(shù)可能(什么可能,是一定!)返回錯誤的值,此時函數(shù)會屏蔽存在lpNumberOfFreeClusters及l(fā)pTotalNumberOfClusters中的值,因此建議不要用該函數(shù)來獲得大于2G分區(qū)的信息。對于大于2G的分區(qū)應當使用GetDiskFreeSpaceEx函數(shù)(從Win95 OEM OSR2開始),此函數(shù)可以返回分區(qū)的有關(guān)正確信息。

  找到了問題所在便可以對癥下藥了,即用GetDiskFreeSpaceEx函數(shù)代替GetDiskFreeSpace函數(shù)即可。以下是GetDiskFreeSpaceEx函數(shù)中所要傳遞增的參數(shù)

  lpRootPathName String ,不包括卷名的磁盤根路徑名
lpFreeBytesAvailableToCaller LARGE_INTEGER,指定一個變量,用于容納調(diào)用者可用的字節(jié)數(shù)量
lpTotalNumberOfBytes LARGE_INTEGER ,指定一個變量,用于容納磁盤上的總字節(jié)數(shù)
lpTotalNumberOfFreeBytes LARGE_INTEGER,指定一個變量,用于容納磁盤上可用的字節(jié)數(shù)

Private Type LARGE_INTEGER
 lowpart As Long
 highpart As Long
End Type

  我們可以看到LARGE_INTEGER是一個由兩個long型組成的一個類型,兩個long組成表示的都是無符號的數(shù),在轉(zhuǎn)換時應當定義一個single型的變量,使其等于highpart*(2^32-1) + lowpart,注意此處的兩個long型相當于C/C++中的無符號型整數(shù)類型,因為在VB中不存在此種類型,故而在換算時要處理好轉(zhuǎn)換關(guān)系。我本人的做法是首先判斷l(xiāng)ong型變量的正負,如是正直接相乘,如是負則用2^32-1減去該值再相乘(具體算法詳見下面的代碼)。
Option Explicit
Private Type LARGE_INTEGER
 lowpart As Long
 highpart As Long
End Type

Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) As Long

Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" _
(ByVal lpRootPathName As String, lpFreeBytesAvailableToCaller As LARGE_INTEGER, _
lpTotalNumberOfBytes As LARGE_INTEGER, lpTotalNumberOfFreeBytes _
As LARGE_INTEGER) As Long

Private Sub Command1_Click()
 Dim lngSectors&
 Dim lngTotalCluster&
 Dim lngFreeCluster&
 Dim lngPerCluster&
 Dim lngperBytes&
 Dim lngSize#
 GetDiskFreeSpace "c:\", lngPerCluster, lngperBytes, lngFreeCluster, lngTotalCluster

 MsgBox CStr(lngTotalCluster * lngperBytes * lngPerCluster)
 Debug.Print lngTotalCluster, lngperBytes, lngPerCluster
End Sub

Private Type LARGE_INTEGER
 lowpart As Long
 highpart As Long
End Type
Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) As Long

Private Declare Function GetDiskFreeSpaceEx Lib "kernel32" Alias "GetDiskFreeSpaceExA" _
(ByVal lpRootPathName As String, lpFreeBytesAvailableToCaller As LARGE_INTEGER, _
lpTotalNumberOfBytes As LARGE_INTEGER, lpTotalNumberOfFreeBytes _
As LARGE_INTEGER) As Long

Private Sub Command1_Click()
'用GetDiskFreeSpace得到錯誤的容量
 Dim lngSectors&
 Dim lngTotalCluster&
 Dim lngFreeCluster&
 Dim lngPerCluster&
 Dim lngperBytes&
 Dim lngSize#
 GetDiskFreeSpace "c:\", lngPerCluster, lngperBytes, lngFreeCluster, lngTotalCluster

  MsgBox CStr(lngTotalCluster * lngperBytes * lngPerCluster)
End Sub

Private Sub cmdStart_Click()
'用GetDiskFreeSpaceEx得到正確的容量
 Dim lngFreeCaller As LARGE_INTEGER
 Dim lngTotal As LARGE_INTEGER
 Dim lngTotalFree As LARGE_INTEGER
 Dim sngSize#

 GetDiskFreeSpaceEx "c:\", lngFreeCaller, lngTotal, lngTotalFree
'以下用來顯示出分區(qū)總?cè)萘?以G為單位)
 MsgBox GetSize(lngTotal) / 2 ^ 30
End Sub

Private Function GetSize(lngSize As LARGE_INTEGER) As Single

'用來從LARGE_INTEGER型變量中換算出實際的大小
With lngSize
 If .highpart < 0 Then
  GetSize = (2 ^ 32 - 1 - .highpart) * (2 ^ 32 - 1)
 Else
  GetSize = .highpart * (2 ^ 32 - 1)
 End If
 If .lowpart < 0 Then
  GetSize = GetSize + (2 ^ 32 - 1 - .lowpart)
 Else
  GetSize = GetSize + .lowpart
 End If
End With
End Function

Private Function GetSize(lngSize As LARGE_INTEGER) As Single

 '用來從LARGE_INTEGER型變量中換算出實際的大小
 With lngSize
  If .highpart < 0 Then
   GetSize = (2 ^ 32 - 1 - .highpart) * (2 ^ 32 - 1)
  Else
   GetSize = .highpart * (2 ^ 32 - 1)
  End If
  If .lowpart < 0 Then
   GetSize = GetSize + (2 ^ 32 - 1 - .lowpart)
  Else
   GetSize = GetSize + .lowpart
  End If
 End With
End Function

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

主站蜘蛛池模板: 亚洲天天在线日亚洲洲精 | 牛牛精品| 亚洲成a人片77777老司机 | 久久精品国产亚洲a | 91视频老司机| 精品亚洲一区二区三区 | 激情五月综合网 | 激情久久久久久久久久久 | 好紧好爽的午夜寂寞视频 | 中文字幕久精品免费视频 | 欧美精品亚洲精品日韩一区 | 亚洲一区成人 | 99在线视频播放 | 四虎精品免费永久在线 | 欧美xxxxx性喷潮 | 伊人网在线免费视频 | 操美女逼逼 | 免费看男女下面日出水视频 | 国产精品美女网站 | 97人人做人人爽人人喊 | 日韩a在线看免费观看视频 日韩v | 天天搞天天干 | 国产在线观看网址在线视频 | 美国一级毛片片aa久久综合 | 久久精品国产一区二区三区日韩 | 亚洲精品一区二区 | 成人免费观看视频久爱网 | 手机午夜视频 | 人人射人人 | 91精品宅男在线观看 | 就要草 | 日本理论视频 | 极品美女aⅴ高清在线观看 极品色综合 | 久久免费播放 | 五月天亚洲视频 | 巨大乳hdbbw| 青草草在线观看免费视频 | 91九色露脸 | 成人伊人青草久久综合网破解版 | 中国产一级毛片 | 天天操夜夜操狠狠操 |