調(diào)用DLL獲取磁盤結(jié)構(gòu)信息

字號:

在編程時我們經(jīng)常需要用到系統(tǒng)中可用磁盤的一些信息,在Visual FoxPro中可用DiskSpace()、Sys(2022)得到剩余空間和簇大小,但如果需要磁盤組織的其他一些信息如卷標、序列號等,這些信息直接使用VFP提供的函數(shù)顯然是無法得到的。本文介紹訪問動態(tài)鏈接庫,調(diào)用DLL函數(shù)GetLogicalDriverStrings、GetDriveType、GetVolumeInformation和GetDiskFreeSpace來獲得磁盤組織的重要信息的方法,以便在文件創(chuàng)建、軟件注冊時加以應(yīng)用。這四個函數(shù)的主要功能如下:
    GetLogicalDriverStrings: 用以獲取可用磁盤代碼(盤符),包括硬盤的邏輯分區(qū)。
    GetDriveType: 用以獲得磁盤類型,以區(qū)別是軟驅(qū)、硬盤、網(wǎng)絡(luò)驅(qū)動器、CDROM還是RAM虛擬盤。
    GetVolumeInformation: 用以獲取包括磁盤卷標、序列號、文件名每個部分(如路徑中“\”與“\”之間部分的長度)、文件系統(tǒng)的某些特性等與磁盤卷有關(guān)的信息。
    GetDiskFreeSpace: 用以獲取磁盤上每簇扇區(qū)數(shù)、每扇區(qū)字節(jié)數(shù)、剩余簇數(shù)、總簇數(shù)等與磁盤組織有關(guān)的信息。
    這四個函數(shù)均包含在%SystemRoot%\System32\
    Kernel32.dll中,在調(diào)用時,需先用DECLARE命令注冊DLL函數(shù),并指定參數(shù)的數(shù)目和類型,也可以在參數(shù)前添加“@”來強制參數(shù)按引用傳遞。函數(shù)的名稱要區(qū)分大小寫,并指定WIN32API為庫名稱。Visual FoxPro將到Kernel32.dll中自動查找被調(diào)用的32位Windows DLL函數(shù)。如圖1所示,運行TEST表單即可掃描當前系統(tǒng)上所有可用盤符,并出現(xiàn)在盤符下拉框中。下面介紹其具體實現(xiàn)方法。
    創(chuàng)建表單
    創(chuàng)建表單并在Form的Activate過程中添加代碼,添加的代碼如下:
    ※ 獲得當前系統(tǒng)上所有可用磁盤代碼,并作為Form中盤符組合框的數(shù)值
    PUBLIC sAllDrivers, sAvaiDsk
    DECLARE INTEGER GetLogicalDriveStrings IN Win32api AS GetLogDsk INTEGER nBufferLength, STRING lpBuffer
    IngRetVal=0
    sAllDrivers = SPACE(128)
    &&獲得所有可用磁盤代碼
    lngRetVal = GetLogDsk(LEN(sAllDrivers), @sAllDrivers)
    CLEAR DLLS
    sAllDrivers=TRIM(sAllDrivers)
    ※ sAllDrivers=“A:\ B:\ C:\……”,盤符之間原用chr(0)分隔的,改用“,”間隔
    sAllDrivers=CHRTRAN(sAllDrivers,CHR(0),“,”)
    THISFORM.sAllDsk.VALUE=sAllDrivers
    THISFORM.combo1.ADDITEM(sAllDrivers)
    && 將可用盤符添加到combo1的選項中.
    在此可將不同磁盤類型對應(yīng)的圖標(或位圖)添加到盤符符組合框combo1.picture屬性中,如圖1所示,圖中可見帶圖標的組合下拉框列表,代碼此略。
    查詢磁盤信息
    如果要在盤符下拉框中選擇任一可用盤,立即顯示其結(jié)構(gòu)信息,如圖2所示,這需要在盤符組合框combo1的Click中添加如下代碼:
    strDrive=TRIM(THISFORM.combo1.VALUE)+“\”
    DECLARE INTEGER GetDriveType IN win32api AS GetDrType STRING nDrive
    DIMENSION DskType(5)
    && 下面判斷磁盤類型
    Dsktype(1)=“軟盤”
    && GetDrType(strDrive)=2
    >Dsktype(2)=“硬盤”
    && GetDrType(strDrive)=3
    Dsktype(3)=“網(wǎng)絡(luò)驅(qū)動器”
    && GetDrType(strDrive)=4
    Dsktype(4)=“CDROM”
    && GetDrType(strDrive)=5
    Dsktype(5)=“RAM虛擬驅(qū)動器”
    && GetDrType(strDrive)=6
    THISFORM.text2.VALUE=DskType(GetDrType(strDrive)-1)