Consultor Eletrônico



Kbase P129274: 4GL/ABL: How to know the number of logical connected drives and their types?
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   27/02/2008
Status: Unverified

GOAL:

4GL/ABL: How to know the number of logical connected drives and their types?

GOAL:

How to Call WIN32 API Function: GetLogicalDriveStringsA

GOAL:

How to Call WIN32 API Function: GetDriveTypeA

FACT(s) (Environment):

Windows
Progress 9.x
OpenEdge 10.x

FIX:

The following 4GL/ABL code displays the number of logical drives connected to the current Windows Operating System and displays their types:
DEFINE VARIABLE vi_size AS INTEGER NO-UNDO.
DEFINE VARIABLE vp_cad AS MEMPTR NO-UNDO.
DEFINE VARIABLE vi_dato AS INTEGER NO-UNDO.
DEFINE VARIABLE vc_car AS CHARACTER NO-UNDO.
DEFINE VARIABLE vi_cont AS INTEGER NO-UNDO.
DEFINE VARIABLE vc_drives AS CHARACTER NO-UNDO.
DEFINE VARIABLE vm_drive AS MEMPTR NO-UNDO.
DEFINE VARIABLE vi_ret AS INTEGER NO-UNDO.

&SCOPED-DEFINE DRIVE_UNKNOWN 0
&SCOPED-DEFINE DRIVE_NO_ROOT_DIR 1
&SCOPED-DEFINE DRIVE_REMOVABLE 2
&SCOPED-DEFINE DRIVE_FIXED 3
&SCOPED-DEFINE DRIVE_REMOTE 4
&SCOPED-DEFINE DRIVE_CDROM 5
&SCOPED-DEFINE DRIVE_RAMDISK 6
PROCEDURE GetLogicalDriveStringsA EXTERNAL "Kernel32.dll":
DEFINE INPUT PARAMETER nBufferLength AS LONG.
DEFINE INPUT PARAMETER lpBuffer AS MEMPTR.
DEFINE RETURN PARAMETER lpstate AS LONG.
END.
PROCEDURE GetDriveTypeA EXTERNAL "Kernel32.dll":
DEFINE INPUT PARAMETER lpRootPathName AS MEMPTR.
DEFINE RETURN PARAMETER lpstate AS LONG.
END.
vi_size = 512.
SET-SIZE(vp_cad) = 512.
RUN GetLogicalDriveStringsA (INPUT vi_size,
INPUT vp_cad,
OUTPUT vi_dato).
DO vi_cont = 1 TO vi_dato:
vc_car = CHR(GET-BYTE(vp_cad,vi_cont)).
IF GET-BYTE(vp_cad,vi_cont) <> 0 THEN
vc_drives = vc_drives + vc_car.
ELSE IF vi_cont <> vi_dato THEN
vc_drives = vc_drives + ",".
END.
MESSAGE "Total of logical drives: " NUM-ENTRIES(vc_drives) SKIP
"Logical Drives Found: " vc_drives
VIEW-AS ALERT-BOX INFO BUTTONS OK.
DO vi_cont = 1 TO NUM-ENTRIES(vc_drives):
RUN DriveType( INPUT ENTRY(vi_cont,vc_drives)).
END.

/*** Free Memory ***/
SET-SIZE(vp_cad) = 0.

PROCEDURE DriveType:
DEFINE INPUT PARAMETER vc_drive AS CHARACTER NO-UNDO.
SET-SIZE(vm_drive) = LENGTH(vc_drive) + 1.
PUT-STRING(vm_drive,1) = vc_drive.
RUN GetDriveTypeA(INPUT vm_drive, OUTPUT vi_ret).
CASE vi_ret:
WHEN {&DRIVE_UNKNOWN} THEN
MESSAGE "The type of Drive: " vc_drive "is " vi_ret ":" SKIP
"The drive type cannot be determined"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
WHEN {&.DRIVE_NO_ROOT_DIR} THEN
MESSAGE "The type of Drive: " vc_drive "is " vi_ret ":" SKIP
"The root path is invalid, for example, no volume is mounted at the path."
VIEW-AS ALERT-BOX INFO BUTTONS OK.
WHEN {&DRIVE_REMOVABLE} THEN
MESSAGE "The type of Drive: " vc_drive "is " vi_ret ":" SKIP
"The drive is a type that has removable media, for example, a floppy drive or removable hard disk"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
WHEN {&DRIVE_FIXED} THEN
MESSAGE "The type of Drive: " vc_drive "is " vi_ret ":" SKIP
"The drive is a type that cannot be removed, for example, a fixed hard drive"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
WHEN {&DRIVE_REMOTE} THEN
MESSAGE "The type of Drive: " vc_drive "is " vi_ret ":" SKIP
"The drive is a remote (network) drive"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
WHEN {&DRIVE_CDROM} THEN
MESSAGE "The type of Drive: " vc_drive "is " vi_ret ":" SKIP
"The drive is a CD-ROM drive"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
WHEN {&DRIVE_RAMDISK} THEN
MESSAGE "The type of Drive: " vc_drive "is " vi_ret ":" SKIP
"The drive is a RAM disk"
VIEW-AS ALERT-BOX INFO BUTTONS OK.
END CASE.
END PROCEDURE..