Announcement

Collapse
No announcement yet.

zugehörigen Dateinamen im neuem PropertySheet ermitteln

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • zugehörigen Dateinamen im neuem PropertySheet ermitteln

    Hallo,

    kann mir vielleicht jemand helfen. Ich habe lt. Entwickler 5/2000 mir eine eigenes PropertySheet für eine bestimmte Ext. zusammengebaut, funktioniert ganz gut. Aber wie kann ich jetzt in diesem COM-Objekt den zugehörigen Dateinamen ermitteln. Sinn der Übung: Im PropertySheet sollen spezifische Infos aus der Datei angezeigt werden, sprich, ich muß einen Stream auslesen.

    Vielen Danke
    Matze

  • #2
    Hallo,

    das dort vorgestellte COM-Objekt implementiert das von Microsoft vorgesehen <b>IShellExtInit</b>-Interface. Und dort ist die Methode <b>Initialize</b> für die Information des eigenen Objekts über die aktuell markierte Datei zuständig. Da dieser Namen mit der VCL kollidiert, nutzt das Beispiel das Methoden-Mapping aus, um einen eindeutigen Methodennamen (ShellExtInitialize) festzulegen.
    <pre>
    type
    TOSPropSheetTest = class(TTypedComObject, IOSPropSheetTest,
    IShellExtInit, IShellPropSheetExt)
    protected
    // Methoden-Mapping, um Initialize eindeutig zu machen
    function IShellExtInit.Initialize = ShellExtInitialize;
    // IShellExtInit (aus ShlObj kopieren)
    function ShellExtInitialize(pidlFolder: PItemIDList;
    lpdobj: IDataObject;
    hKeyProgID: HKEY): HResult; stdcall;
    // IShellPropSheetExt (aus ShlObj kopieren)
    function AddPages(lpfnAddPage: TFNAddPropSheetPage;
    lParam: LPARAM): HResult; stdcall;
    function ReplacePage(uPageID: UINT;
    lpfnReplaceWith: TFNAddPropSheetPage;
    lParam: LPARAM): HResult; stdcall;
    end;
    </pre>
    In der Microsoft-Hilfedatei des <i>Platform SDK</i> ist dazu folgendes zu lesen: "<i>For property sheet extensions, pidlFolder is NULL, lpdobj identifies the selected file objects, and hkeyProgID specifies the file class of the file object that has the focus.</i>."<br>
    Somit steht im Parameter <b>lpdobj</b> ein Interface-Zeiger auf das IDataObject-Interface für die ausgewählte Datei zur Verfügung. Um nun den Dateinamen zu ermittelt, würde ich die Beschreibung aus dem Platform SDK in den folgenden Pseudocode umwandeln:<br>
    1. TFormatEtc-Struktur initialisieren <br>
    2. TStgMedium-Struktur initialisieren <br>
    3. lpdobj.GetData(TFormatEtc-Struktur ,TStgMedium-Struktur) aufrufen<br>
    4. DragQueryFile(TStgMedium-Struktur.hGlobal, 0, szFileName, SizeOf(szFileName)) aufrufen

    P.S: Eine Beschreibung von IDataObject, der o.h. Strukturen und mehrere Beispiele für den Zugriff auf IDataObject ist in meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> zu finden.
    &#10

    Comment


    • #3
      Danke,

      funktioniert bestens. Eine kleine bitte noch: Könnten Sie sich bitte mal den Punkt Document Properties anschauen.

      Danke
      Matz

      Comment

      Working...
      X