This code was posted to PEG by Jared Middleton.
/******************************************************************* Procedure: shellfile.p Description: Demo program to access File Summary Properties using Shell FolderItems object GetDetailsOf method. Written by: Jared Middleton (January 17, 2007) *******************************************************************/ DEFINE VAR chApp AS COM-HANDLE NO-UNDO. DEFINE VAR chFolder AS COM-HANDLE NO-UNDO. DEFINE VAR chFolderItem AS COM-HANDLE NO-UNDO. DEFINE VAR cFile AS CHARACTER NO-UNDO. DEFINE VAR cDir AS CHARACTER NO-UNDO. DEFINE VAR cBase AS CHARACTER NO-UNDO. DEFINE VAR lOpen AS LOGICAL NO-UNDO. DEFINE VAR cLabel AS CHARACTER NO-UNDO FORMAT "x(24)". DEFINE VAR cValue AS CHARACTER NO-UNDO FORMAT "x(50)". DEFINE FRAME frmDisp cLabel cValue WITH NO-LABELS DOWN. SYSTEM-DIALOG GET-FILE cFile FILTERS 'All Files (*.*)' '*.*', 'MP3 Files (*.mp3)' '*.mp3', /* optional */ 'JPG Files (*.jpg,*.jpeg)' '*.jpg,*.jpeg' /* optional */ UPDATE lOpen. IF NOT lOpen THEN RETURN. CREATE "Shell.Application" chApp NO-ERROR. IF VALID-HANDLE(chApp) THEN DO: ASSIGN cDir = SUBSTRING(cFile,1,R-INDEX(cFile,"\") - 1) cBase = SUBSTRING(cFile,LENGTH(cDir) + 2). ASSIGN chFolder = chApp:Namespace(cDir). IF VALID-HANDLE(chFolder) THEN DO: ASSIGN chFolderItem = chFolder:ParseName(cBase). /* Extended File Properties are OS version specific. The following are valid for Windows XP/2003 */ IF VALID-HANDLE(chFolderItem) THEN DO: RUN get-item ("File:",0). RUN get-item ("Size:",1). RUN get-item ("Type:",2). RUN get-item ("Title:",10). RUN get-item ("Subject:",11). RUN get-item ("Category:",12). RUN get-item ("Artist:",16). RUN get-item ("Album:",17). RUN get-item ("Year:",18). RUN get-item ("Track:",19). RUN get-item ("Genre:",20). RUN get-item ("Duration:",21). RUN get-item ("Bit Rate:",22). /*RUN get-item ("Protected:",23).*/ /*RUN get-item ("Episode Name:",29).*/ /*RUN get-item ("Audio Sample Size:",32).*/ RUN get-item ("Audio Sample Rate:",33). RUN get-item ("Channels:",34). RUN get-item ("Camera Model:",24). RUN get-item ("Date Taken:",25). /*RUN get-item ("Dimensions:",26).*/ RUN get-item ("Width:",27). RUN get-item ("Height:",28). END. END. END. RELEASE OBJECT chFolderItem NO-ERROR. RELEASE OBJECT chFolder NO-ERROR. RELEASE OBJECT chApp NO-ERROR. PROCEDURE get-item: DEFINE INPUT PARAMETER l-cLabel AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER l-cItem AS INTEGER NO-UNDO. DEFINE VAR l-cValue AS CHARACTER NO-UNDO. DO WITH FRAME frmDisp: ASSIGN l-cValue = chFolder:GetDetailsOf(chFolderItem,l-cItem). IF l-cValue > "" THEN DO: DISPLAY l-cLabel @ cLabel l-cValue @ cValue. DOWN. END. END. END PROCEDURE. /* End of program */