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 */