• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        用VB獲得大容量硬盤信息

        用VB獲得大容量硬盤信息

        更新時間:2019-09-02 文章作者:未知 信息來源:網絡 閱讀次數:

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

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

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

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

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

        Private Type LARGE_INTEGER
         lowpart As Long
         highpart As Long
        End Type

          我們可以看到LARGE_INTEGER是一個由兩個long型組成的一個類型,兩個long組成表示的都是無符號的數,在轉換時應當定義一個single型的變量,使其等于highpart*(2^32-1) + lowpart,注意此處的兩個long型相當于C/C++中的無符號型整數類型,因為在VB中不存在此種類型,故而在換算時要處理好轉換關系。我本人的做法是首先判斷long型變量的正負,如是正直接相乘,如是負則用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
        '以下用來顯示出分區總容量(以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

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

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 国产亚洲精品影视在线| 精品亚洲综合在线第一区| 亚洲一区动漫卡通在线播放| 特级无码毛片免费视频尤物 | 国产精品极品美女自在线观看免费 | 亚洲AV无码国产一区二区三区| 男男AV纯肉无码免费播放无码| 亚洲va成无码人在线观看| 114一级毛片免费| 亚洲制服丝袜中文字幕| 猫咪社区免费资源在线观看 | 日韩a毛片免费观看| 久久久精品国产亚洲成人满18免费网站 | 国产偷伦视频免费观看| 亚洲bt加勒比一区二区| 99精品热线在线观看免费视频| 亚洲系列国产精品制服丝袜第| 四虎在线视频免费观看视频| 久久亚洲国产成人影院| 又粗又硬免费毛片| 三上悠亚在线观看免费| 亚洲综合成人网在线观看| 无码国产精品一区二区免费虚拟VR| 四虎必出精品亚洲高清| 国产精品色午夜视频免费看| 抽搐一进一出gif免费视频| 亚洲精品自产拍在线观看动漫| 猫咪社区免费资源在线观看| 偷自拍亚洲视频在线观看99| 国产AV无码专区亚洲AV男同 | 久久久久久国产a免费观看黄色大片| 亚洲熟妇AV一区二区三区浪潮| 免费成人午夜视频| 免费日本一区二区| 亚洲人成网站色7799| 亚洲国产成人精品女人久久久| 无码囯产精品一区二区免费 | 国产亚洲精品bv在线观看| 亚洲午夜激情视频| 99爱在线精品免费观看| 西西人体大胆免费视频|