Consultor Eletrônico



Kbase 21317: How To Retrieve Mapped Drives -- A Sample Program
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   12/11/2002
Status: Unverified

GOAL:

How to retrieve all the mapped drives by using both the WNet functions (WNetOpenEnum, WNetEnumResource, WNetCloseEnum) and the Windows Script Host (WSH) shell

FACT(s) (Environment):

Windows 32 Intel

FIX:

Run this program and select either the "WSH" button or the "Wnet" button.
DEFINE VARIABLE C-Win AS WIDGET-HANDLE NO-UNDO.

/* Definitions of the field level widgets */
DEFINE BUTTON cmdWnet
LABEL "&Wnet"
SIZE 15 BY 1.14.

DEFINE BUTTON cmdWSH
LABEL "&WSH"
SIZE 15 BY 1.14.

DEFINE VARIABLE lstDrive AS CHARACTER
VIEW-AS SELECTION-LIST SINGLE SCROLLBAR-VERTICAL
SIZE 54 BY 8.57
FGCOLOR 1 FONT 6 NO-UNDO.

/* Definitions */

PROCEDURE WNetOpenEnumA EXTERNAL "mpr.dll":
DEFINE INPUT PARAMETER dwScope AS LONG.
DEFINE INPUT PARAMETER dwType AS LONG.
DEFINE INPUT PARAMETER dwUsage AS LONG.
DEFINE OUTPUT PARAMETER lpNetResource AS MEMPTR.
DEFINE OUTPUT PARAMETER lphEnum AS LONG.
DEFINE RETURN PARAMETER res AS LONG.
END PROCEDURE.

PROCEDURE WNetEnumResourceA EXTERNAL "mpr.dll":
DEFINE INPUT PARAMETER hEnum AS LONG.
DEFINE INPUT-OUTPUT PARAMETER lpcCount AS LONG.
DEFINE INPUT PARAMETER lpBuffer AS MEMPTR.
DEFINE INPUT-OUTPUT PARAMETER lpBufferSize AS LONG.
DEFINE RETURN PARAMETER res AS LONG.
END PROCEDURE.

PROCEDURE WNetCloseEnum EXTERNAL "mpr.dll":
DEFINE INPUT PARAMETER hEnum AS LONG.
DEFINE RETURN PARAMETER res AS LONG.
END PROCEDURE.


/* Frame definition */
DEFINE FRAME frmMain
lstDrive AT ROW 1.95 COL 4 NO-LABEL
cmdWnet AT ROW 11 COL 43
cmdWSH AT ROW 11 COL 25
WITH 1 DOWN NO-BOX KEEP-TAB-ORDER OVERLAY
SIDE-LABELS NO-UNDERLINE THREE-D
AT COL 1 ROW 1
SIZE 62 BY 11.92.

/* Triggers */
/* WNet */
ON CHOOSE OF cmdWnet IN FRAME frmMain
DO:
DEFINE VARIABLE iStatus AS INTEGER NO-UNDO.
DEFINE VARIABLE lphEnum AS INTEGER NO-UNDO.
DEFINE VARIABLE entries AS INTEGER NO-UNDO.
DEFINE VARIABLE hEnum AS INTEGER NO-UNDO.
DEFINE VARIABLE pBufferSize AS INTEGER NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE iRes AS INTEGER NO-UNDO.

DEFINE VARIABLE pBuffer AS MEMPTR NO-UNDO.
DEFINE VARIABLE pNetResource AS MEMPTR NO-UNDO.
DEFINE VARIABLE pNetInfo AS MEMPTR NO-UNDO.
DEFINE VARIABLE pLocalName AS MEMPTR NO-UNDO.
DEFINE VARIABLE pRemoteName AS MEMPTR NO-UNDO.

SET-SIZE(pNetResource) = 32.

/* Starts an enumeration of existing connections. */
RUN WNetOpenEnumA (
INPUT 1, /* All currently connected resources */
INPUT 1, /* All disk resources.*/
INPUT 0, /* All resources */
OUTPUT pNetResource,
OUTPUT hEnum,
OUTPUT iStatus ).

IF iStatus = 0 AND hEnum <> 0 THEN entries = 1024.

SET-SIZE(pBuffer) = 1024 .
pBufferSize = GET-SIZE(pBuffer) .

/* Continues the network-resource enumeration started by the
WNetOpenEnum function. */
RUN WNetEnumResourceA (
INPUT hEnum ,
INPUT-OUTPUT entries,
INPUT pBuffer ,
INPUT-OUTPUT pBufferSize ,
OUTPUT iStatus).

IF iStatus = 0 THEN DO:
DO i = 0 TO entries - 1 :
SET-POINTER-VALUE(pNetInfo) = GET-POINTER-VALUE(pBuffer) + (i * 32).
SET-POINTER-VALUE(pLocalName) = GET-LONG(pNetInfo,17) .
SET-POINTER-VALUE(pRemoteName) = GET-LONG(pNetInfo,21) .

LstDrivE:ADD-LAST(GET-STRING(pLocalName,1) + " " + GET-STRING(pRemoteName,1) ).
END. /* DO */
END. /* IF */


RUN WNetCloseEnum (
INPUT hEnum ,
OUTPUT iRes).

/* Release pointers*/
SET-SIZE(pNetResource) = 0.
SET-SIZE(pBuffer) = 0.
SET-SIZE(pNetInfo) = 0.
SET-SIZE(pLocalName) = 0.
SET-SIZE(pRemoteName) = 0.
END.

/* WScript */
ON CHOOSE OF cmdWSH IN FRAME frmMain
DO:

DEFINE VARIABLE chDrives AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE chWshNet AS COM-HANDLE NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
DEFINE VARIABLE cRetVal AS CHARACTER NO-UNDO.

CREATE "Wscript.Network" chWshNet.

I.F VALID-HANDLE(chWshNet) THEN
DO:
chDrives = chWshNet:EnumNetworkDrives.

DO i = 1 TO chDrives:Count BY 2:
ASSIGN cRetVal = cRetVal
+ MIN(cRetVal, ",~n")
+ chDrives:ITEM(i - 1)
+ " "
+ chDrives:Item(i)
.
END.

RELEASE OBJECT chDrives.
RELEASE OBJECT chWshNet.

MESSAGE cRetval VIEW-AS ALERT-BOX.
END. /* IF */
ELSE MESSAGE "Please install Windows Scripting Host."
VIEW-AS ALERT-BOX TITLE "Missing WSH Shell".
END.

DO ON ERROR UNDO, LEAVE
ON END-KEY UNDO,LEAVE :
DISPLAY cmdWnet lstDrive cmdWSH WITH FRAME frmMain.
ENABLE cmdWnet lstDrive cmdWSH WITH FRAME frmMain.

WAIT-FOR CLOSE OF THIS-PROCEDURE.
END..