Q&A

  • 내컴퓨터에 드라이브목록을 구하고 싶은데?
안녕하세요.

질문이 있습니다.



내컴퓨터에 있는 드라이브목록을 ListBox에 출력하고 싶거든요.

그러니깐.. 예로..

A: 3.5 "

B: 5.25 "

C: HDD1

D: CD-ROM



이렇게 리스트박스에 출력하고 싶은데 어떻게 구하는지 모르겠네요.

드라이브목록 구하는 함수가 있다면.. 좀 가르쳐 주세요?

아.. 컴포넌트 사용하라는 그런답변은 사양합니다. ^^;





1  COMMENTS
  • Profile
    이정욱 1999.10.21 02:57


    아래에 함수를 올립니다.





    procedure TForm1.Button1Click(Sender: TObject);

    var

    ld : DWORD;

    i : integer;

    begin

    ld := GetLogicalDrives;

    for i := 0 to 25 do begin

    if (ld and (1 shl i)) <> 0 then

    Memo1.Lines.Add(Char(Ord('A') + i) + ':');

    end;

    end;



    구해진 리스트로 드라이브 타잎은 아래처럼 구하세요.

    type

    TDriveType = (dtUnknown, dtNoDrive, dtFloppy, dtFixed, dtNetwork, dtCDROM,

    dtRAM, dtFloppy3, dtFloppy5);



    function GetDriveType (Drive : Char) : TDriveType;

    begin

    Result := TDriveType (Windows.GetDriveType(PChar(Drive + ':')))

    end;







    그리고 이런 방법도 있습니다. 둘중에 좋은것을 쓰세요.



    Const

    dtInvalid = 0;

    dtFloppy = 1;

    dtHardDisk = 2;

    dtRamDrive = 3;

    dtNetDrive = 4;

    dtSubstDrive = 5;

    dtCDROM = 6;



    function DriveValid(Drive: Char): Boolean; near; assembler;

    asm

    MOV AH,19H { Save the current drive in BL }

    INT 21H

    MOV BL,AL

    MOV DL,Drive { Select the given drive }

    SUB DL,'A'

    MOV AH,0EH

    INT 21H

    MOV AH,19H { Retrieve what DOS thinks is current }

    INT 21H

    MOV CX,0 { Assume false }

    CMP AL,DL { Is the current drive the given drive? }

    JNE @@1

    MOV CX,1 { It is, so the drive is valid }

    MOV DL,BL { Restore the old drive }

    MOV AH,0EH

    INT 21H

    @@1: XCHG AX,CX { Put the return value into AX }

    end;



    function IsCDRom(Drive: Char): Boolean; near; assembler;

    var

    map: array[0..25] of Byte;

    asm

    mov bx, ss

    mov es, bx

    lea bx, map

    mov di, bx

    cld

    mov cx, 26/2

    mov ax, 0FFFFH

    rep stosw

    mov ax, 150DH

    int 2FH

    lea di, map

    mov al, 1 { Assume it is a CD ROM }

    mov dh, Drive

    sub dh, 'A'

    @@1:

    mov dl, es:[bx]

    cmp dl, dh

    jz @@0 { Found drive letter }

    inc dl

    jz @@2 { End of list }

    inc bx

    jmp @@1

    @@2:

    mov al, 0

    @@0:

    end;



    function IsFixed(Drive: Char): Boolean; near; assembler;

    asm

    mov ax, 4408H

    mov bl, Drive

    sub bl, 'A' - 1

    int 21H

    jnc @@0

    mov al, 1 { On error assume it's fixed }

    @@0:

    end;



    function IsRemote(Drive: Char): Boolean; near; assembler;

    asm

    mov ax, 4409H

    mov bl, Drive

    sub bl, 'A' - 1

    int 21H

    mov al, 0 { Assume it's not remote }

    jc @@0

    shr dx, 12 { Get bit 12 }

    mov al, dl

    and al, 1

    @@0:

    end;



    function IsSubst(Drive: Char): Boolean; near; assembler;

    asm

    mov ax, 4409H

    mov bl, Drive

    sub bl, 'A' - 1

    int 21H

    mov al, 0 { Assume it's not remote }

    jc @@0

    shr dx, 15 { Get bit 15 }

    mov al, dl

    and al, 1

    @@0:

    end;



    function GetDriveType(Drive: Char): Byte;

    begin

    GetDriveType := dtInvalid;

    if DriveValid(Drive) then

    if IsSubst(Drive) then GetDriveType := dtSubstDrive else

    if IsRemote(Drive) then GetDriveType := dtNetDrive else

    if IsCDROM(Drive) then GetDriveType := dtCDROM else

    if IsFixed(Drive) then GetDriveType := dtHardDisk else

    GetDriveType := dtFloppy

    end



    강민주 wrote:

    > 안녕하세요.

    > 질문이 있습니다.

    >

    > 내컴퓨터에 있는 드라이브목록을 ListBox에 출력하고 싶거든요.

    > 그러니깐.. 예로..

    > A: 3.5 "

    > B: 5.25 "

    > C: HDD1

    > D: CD-ROM

    >

    > 이렇게 리스트박스에 출력하고 싶은데 어떻게 구하는지 모르겠네요.

    > 드라이브목록 구하는 함수가 있다면.. 좀 가르쳐 주세요?

    > 아.. 컴포넌트 사용하라는 그런답변은 사양합니다. ^^;

    >

    >