File Summary Properties

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