Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi windows eigenschaften-dialog für datenträger anzeigen lassen (https://www.delphipraxis.net/204530-windows-eigenschaften-dialog-fuer-datentraeger-anzeigen-lassen.html)

KodeZwerg 4. Jun 2020 07:31

windows eigenschaften-dialog für datenträger anzeigen lassen
 
Guten Tag liebe Delphi Gemeinde!

Ich stehe irgendwie mal wieder vor einem Problem, vielleicht ist es was total einfaches, nur komme ich einfach nicht auf einen grünen Zweig....
Folgendes von swissdelphicenter.ch ist gegeben:
Delphi-Quellcode:
{ This code shows the standard file properties dialog like in Windows Explorer }

uses
  shellapi;

// Thanks to Peter Below (TeamB) for this code
procedure PropertiesDialog(FileName: string);
var
  sei: TShellExecuteInfo;
begin
  FillChar(sei, SizeOf(sei), 0);
  sei.cbSize := SizeOf(sei);
  sei.lpFile := PChar(FileName);
  sei.lpVerb := 'properties';
  sei.fMask := SEE_MASK_INVOKEIDLIST;
  ShellExecuteEx(@sei);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  if Opendialog1.Execute then
    PropertiesDialog(Opendialog1.FileName);
end;
Bei Microsoft werde ich einfach nicht fündig wie man den Laufwerks-Eigenschaften-Dialog anzeigen lassen kann.
Weiß jemand wie das geht und kann mich vielleicht in die richtige Richtung stubsen?

Danke für's lesen und jeden Tipp!

Rollo62 4. Jun 2020 14:19

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Hilft das weiter ?

Es scheint so das statt
Delphi-Quellcode:
  sei.lpVerb := 'properties';
das hier gebraucht würde.

Delphi-Quellcode:
  sei.nShow = SW_SHOW;

KodeZwerg 5. Jun 2020 07:07

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Vielen Dank für diesen Tipp, werde ich heut abend gleich mal ausprobieren, Danke danke!

KodeZwerg 22. Jun 2020 08:08

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Hallo nochmal, also ich war in dem moment als ich das posting erstellte selbst nicht auf dem laufenden... Entschuldigung!
(mein code ist noch sehr unübersichtlich, unsortiert und kaum lesbar...)

Der original code funktioniert einwandfrei, auch auf laufwerke.
Mein problem ist zwar schon der "Eigenschaften-Dialog", allerdings auf einer anderen ebene.
Ich poste morgen meinen Code (samt beispielanwendung).

Ich benutze per Windows-Api das Kontext-Menu von Windows für Dateien und Verzeichnisse sowie auch Laufwerke.
Bei Dateien und Ordner sowie auch Laufwerke öffnet sich das Windows-Menu wie gewünscht.
Alles was das Kontext-Menu bietet wird, soweit mir bekannt, sauber und fehlerfrei abgearbeitet, nur eben bei Laufwerken erscheint nicht der Eigenschaften-Dialog.
(ich habe momentan eine fail-safe sache reingebastelt, an der ich hoffe auf eine lösung zu kommen)

Bis morgen in alter frische.

KodeZwerg 23. Jun 2020 07:36

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Morgen/Tag/Abend, hier jetzt mein Code-Problem wie oben beschrieben:

Delphi-Quellcode:
// hier ist mein problem-kind
procedure TMain.InvokeContextMenu(const Owner: TWinControl; const Path: String;
  const X, Y: Integer);
var
  // Item: Integer;
  DeskFolder, Folder: IShellFolder;
  Eaten, Attributes: ULONG;
  PIDL, FolderpIdl: PItemIDList;
  Menu: HMENU;
  Pos: TPoint;
  Cmd: DWORD;
  CommandInfo: TCMInvokeCommandInfo;
  ContextMenu: IContextMenu;
  ContextMenu2: IContextMenu2;
  ContextMenu3: IContextMenu3;
  APath: String;
  aFileName: String;
  aDrive: String;
  aContextMenu: Boolean;
begin
  ContextMenu2 := nil;
  ContextMenu3 := nil;
  aContextMenu := False;

  aDrive := ExtractFileDrive(Path);

  APath := ExtractFilePath(Path);
  if (APath = aDrive) then
    APath := IncludeTrailingPathDelimiter(APath);

  aFileName := ExtractFileName(Path);

  // IShellFolder for Desktop folder (root)
  if Succeeded(SHGetDesktopFolder(DeskFolder)) then
  begin
    // Item ID List for the folder that the file or folder is in
    Attributes := 0;
    if Succeeded(DeskFolder.ParseDisplayName(INVALID_HANDLE_VALUE, nil,
      PWideChar(WideString(APath)), Eaten, FolderpIdl, Attributes)) then
    begin
      // IShellFolder for the folder the file is in
      Attributes := 0;
      if Succeeded(DeskFolder.BindToObject(FolderpIdl, nil, IShellFolder,
        Folder)) then
        if (Length(aFileName) > 0) then
          // Item ID List for the file or folder, relative to the folder it is in
          if Succeeded(Folder.ParseDisplayName(INVALID_HANDLE_VALUE, nil,
            PWideChar(WideString(aFileName)), Eaten, PIDL, Attributes)) then
          begin
            // connect IContextMenu with local PIDL ContextMenu
            aContextMenu := Succeeded(Folder.GetUIObjectOf(INVALID_HANDLE_VALUE,
              1, PIDL, IContextMenu, nil, ContextMenu));
            CoTaskMemFree(PIDL);
          end;
      // try to fallback to system context menu
     // an dieser stelle hüpft der code wenn man "Eigenschaften" von Laufwerken auswählt.
      if (not aContextMenu) then
        // connect IContextMenu with local FolderPIDL ContextMenu
        aContextMenu := Succeeded(DeskFolder.GetUIObjectOf(INVALID_HANDLE_VALUE,
          1, FolderpIdl, IContextMenu, nil, ContextMenu));
      CoTaskMemFree(FolderpIdl);
    end;
  end;

  if (not aContextMenu) then
    Exit;

  Menu := CreatePopupMenu;
  try
    // Populate our menu with shortcut items
    if (Cardinal(ContextMenu.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE))
      and $80000000) = 0 then
    begin
      // ContextMenu2 used in WndProc
      if (ContextMenu.QueryInterface(IContextMenu2, ContextMenu2) = NO_ERROR) or
        (ContextMenu.QueryInterface(IContextMenu3, ContextMenu3) = NO_ERROR)
      then
        try
          Pos.X := X;
          Pos.Y := Y;
          Winapi.Windows.ClientToScreen(Owner.Handle, Pos);
          // launch the menu
          Bool(Cmd) := TrackPopupMenu(Menu, TPM_LEFTBUTTON or TPM_RIGHTBUTTON or
            TPM_RETURNCMD, Pos.X, Pos.Y, 0, Handle, nil);
        finally
          // clear so that we don't intervene every owner drawn menu item message in
          // WndProc
          ContextMenu2 := nil;
          ContextMenu3 := nil;
        end;

      // Invoke command if we have one
      if Bool(Cmd) then
      begin
        FillChar(CommandInfo, SizeOf(CommandInfo), 0);
        CommandInfo.cbSize := SizeOf(CommandInfo);
        CommandInfo.HWnd := Handle;
        CommandInfo.lpVerb := PAnsiChar(MakeIntResource(Cmd - 1));
        CommandInfo.fMask := CMIC_MASK_ICON or CMIC_MASK_UNICODE or
          CMIC_MASK_ASYNCOK or CMIC_MASK_NOZONECHECKS;
        CommandInfo.nShow := SW_SHOWNORMAL;
        OleCheck(ContextMenu.InvokeCommand(CommandInfo));
      end;
    end;

  finally
    DestroyMenu(Menu);
  end;
end;

// das menu wird hiermit eingeleitet.
// es wird immer der komplette pfad übermittelt.
// für laufwerke wird der slash abgeschnitten.
procedure TMain.LeftViewMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  S: String;
begin
  if Button = mbRight then
    if LeftView.Selected <> nil then
    begin
      S := LeftShellItem(LeftView.Selected.Index).FullPath;
      if S[Length(S)] = '\' then
        S := Copy(S, 1, Length(S) - 1);
      InvokeContextMenu(Self, S, X, Y);
    end;
end;
Im Beispiel Anhang ist unten ein "F9" Knopf drückbar (nicht per Hotkey) der auf meine erste Post verweist, da hatte ich mich geirrt, verzeihung nochmal.
Zur Vollständigkeit hier der "F9" Knopf:

Delphi-Quellcode:
// der "F9" Knopf-Code, funktioniert 1A

procedure TMain.BTN_F09Click(Sender: TObject);
begin
  if LeftView.Selected <> nil then
    ShellExec(LeftShellItem(LeftView.Selected.Index).FullPath, 'properties');
end;

function ShellExec(const PIDL: PItemIDList; const Operation: string)
  : Boolean; overload;
var
  SEI: TShellExecuteInfo;
  Path: array [0 .. 512] of WideChar;
begin
  Result := False;
  if SHGetPathFromIDList(PIDL, @Path) then
  begin
    FillChar(SEI, SizeOf(SEI), 0);
    SEI.Wnd := GetActiveWindow();
    SEI.cbSize := SizeOf(SEI);
    SEI.lpFile := PChar(@Path);
    SEI.lpVerb := PChar(Operation);
    SEI.fMask := SEE_MASK_INVOKEIDLIST;
    SEI.nShow := SW_SHOWNORMAL;
    Result := ShellExecuteEx(@SEI);
  end;
end;
Danke für's Lesen!


Der Anhang ist nur ein Kompilat, ohne Quelltext, da noch mörderisch in Entwicklung.
Benutzt wird Delphi Rio.

KodeZwerg 29. Jun 2020 07:24

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
*stubs an, falls jemand eine Idee hat bitte melden...*

Dalai 29. Jun 2020 08:01

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Für mich sind deine Ausführungen leider verwirrend. Geht es um das Kontextmenü oder um den Eigenschaften-Dialog? In deinem Code kommen beide Dinge vor. Was genau willst du erreichen? Warum das Kontextmenü, wenn der Weg über ShellExecuteEx mit dem Verb properties laut deinem Code einwandfrei funktioniert?

Hast du mal versucht, den Backslash zu belassen?

Delphi-Quellcode:
S := LeftShellItem(LeftView.Selected.Index).FullPath;
if S[Length(S)] = '\' then
    S := Copy(S, 1, Length(S) - 1);
kann man übrigens auch viel einfacher schreiben:
Delphi-Quellcode:
S := ExcludeTrailingPathDelimiter(LeftShellItem(LeftView.Selected.Index).FullPath);
Aber wie gesagt: ich würd's mal ohne Wegschneiden des Backslashs probieren bzw. mit dem Pfad in deiner Funktion ShellExec vergleichen.

Grüße
Dalai

KodeZwerg 29. Jun 2020 08:11

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Also, mein Problem sitzt im Kontextmenu.
Es ist ein Teil eines Dateimanagers.
Der "F9" Code bezieht sich auf's ShellExec, klappt super.
Was wiederum nicht funktioniert ist, wenn ich das Kontextmenu darstellen lasse, ausgehend eines Laufwerks (nicht Datei oder Ordner, da klappt alles), wenn man nun "Eigenschaften" auswählt.
Erwartet war das im Endeffekt der "F9" Dialog dargestellt wird, momentan wird nur mein Fallback aufgerufen wo man sich sein System anzeigen lassen kann.

Um es nachvollziehen zu können, den Manager starten, rechtsklick auf ein Laufwerk, Eigenschaften auswählen = das von mir beschriebene Problem.

ps: Ich hatte es anfangs mit "\" am ende, das mochte das kontextmenu irgendwie nicht.

Dalai 29. Jun 2020 08:50

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
So langsam verstehe ich. Weil du Teile des Windows-Kontextmenüs anzeigst, musst du dessen Kram benutzen und kannst nicht stattdessen einfach ShellExecuteEx rufen. Es wäre gut gewesen, wenn das aus deinen bisherigen Ausführungen klar(er) hervorgegangen wäre. Ja, ich weiß, hätte hätte ;).

Bei mir öffnet sich beim Klick auf Eigenschaften im Kontextmenü das Fenster mit den Systemeigenschaften.

Eine wichtige Sache: Ich rate dir dringend, davon Abstand zu nehmen, Benutzereinstellungen zu ändern! Bei Ausführung deiner EXE hab ich mich sofort gewundert, warum auf einmal die Animation beim Minimieren/Maximieren von Fenstern wieder aktiv ist, und das ist eindeutig auf dein Kompilat zurückzuführen. Es hat seinen Grund, warum ein Nutzer Einstellungen so tätigt, und Programme haben das zu respektieren und nicht daran rumzufummeln - das gilt für (so ziemlich) alle Einstellungen.

Zurück zum Thema. Du schriebst, du hast aktuell einen Failsafe eingebaut. Wird denn eine Exception durch das OleCheck ausgelöst oder wird das InvokeCommand des Kontextmenü sauber gerufen? Oder ist das Öffnen der Systemeigenschaften der Failsafe?

Grüße
Dalai

KodeZwerg 29. Jun 2020 09:25

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Zitat:

Zitat von Dalai (Beitrag 1468410)
So langsam verstehe ich. Weil du Teile des Windows-Kontextmenüs anzeigst, musst du dessen Kram benutzen und kannst nicht stattdessen einfach ShellExecuteEx rufen. Es wäre gut gewesen, wenn das aus deinen bisherigen Ausführungen klar(er) hervorgegangen wäre. Ja, ich weiß, hätte hätte ;).

Es tut mir leid, der erste Post war völlig falsch. Ich dachte danach wäre es eindeutiger zuzuordnen. Sorry again! :-)

Zitat:

Zitat von Dalai (Beitrag 1468410)
Bei mir öffnet sich beim Klick auf Eigenschaften im Kontextmenü das Fenster mit den Systemeigenschaften.

Genau das ist mein Failsafe, da beziehe ich mich nicht auf die ItemPIDL sondern auf die FolderPIDL damit er überhaupt etwas darstellen kann. Im aktuellen Fall halt die Systemeigenschaften wo ich wiederum das tatsächliche Eigenschaften-Fenster erwarten würde.
Es fehlt meinerseits auch noch eine Integration das dieses Menu auch gemalt wird wenn man nicht auf ein Item klickst, kommt noch rein damit es Windows-konformer ist.

Zitat:

Zitat von Dalai (Beitrag 1468410)
Eine wichtige Sache: Ich rate dir dringend, davon Abstand zu nehmen, Benutzereinstellungen zu ändern! Bei Ausführung deiner EXE hab ich mich sofort gewundert, warum auf einmal die Animation beim Minimieren/Maximieren von Fenstern wieder aktiv ist, und das ist eindeutig auf dein Kompilat zurückzuführen. Es hat seinen Grund, warum ein Nutzer Einstellungen so tätigt, und Programme haben das zu respektieren und nicht daran rumzufummeln - das gilt für (so ziemlich) alle Einstellungen.

Puh.... Danke für diese Erkenntnis, ich bin tatsächlich davon ausgegangen das ein aktivieren der Animation nur für mein Programm gilt, auch nur solange es läuft und nicht das dadurch Systemeinstellungen gesetzt werden.
Diese Zeile Code wird nun definitiv entfernt!!
//offtopic
Schatteneffekte habe ich auch aktiviert, gilt das auch als Systemeinstellung?

Ich hoffe mich so ausgedrückt zu haben das es verständlich(er) ist, ich werde an meiner Formulierung noch arbeiten müssen.

Dalai 29. Jun 2020 10:04

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1468412)
Genau das ist mein Failsafe, da beziehe ich mich nicht auf die ItemPIDL sondern auf die FolderPIDL damit er überhaupt etwas darstellen kann.

Löst OleCheck denn eine Exception aus, wenn du den Failsafe weglässt? Wenn ja, was sagt diese? Irgendwas muss ja falsch sein, wenn es nicht funktioniert. Wobei es denkbar ist, dass es auf diesem Weg gar nicht geht, aber das kann ich nicht beurteilen, denn dafür hab ich zu wenig Ahnung von Windows-Kontextmenüs (nahe Null).

Wie groß ist denn Cmd bzw. Cmd-1, wenn das Eigenschaften-Item gerufen wird?

Ich glaube, du solltest das Flag CMIC_MASK_UNICODE nicht setzen. MS schreibt:
Zitat:

CMIC_MASK_UNICODE

The shortcut menu handler should use lpVerbW, lpParametersW, lpDirectoryW, and lpTitleW members instead of their ANSI equivalents.
Die setzt du aber gar nicht. Alternativ kannst du das Flag auch belassen und zusätzlich die angegebenen W-Parameter füllen, solltest dann aber die Struktur TCMInvokeCommandInfoEx statt TCMInvokeCommandInfo nutzen (in der Doku zu letzterem steht nix zum Flag CMIC_MASK_UNICODE).

Zitat:

Puh.... Danke für diese Erkenntnis, ich bin tatsächlich davon ausgegangen das ein aktivieren der Animation nur für mein Programm gilt, auch nur solange es läuft und nicht das dadurch Systemeinstellungen gesetzt werden.
Nun, die Funktion heißt SystemParametersInfo, nicht ProgramParametersInfo.

Zitat:

Schatteneffekte habe ich auch aktiviert, gilt das auch als Systemeinstellung?
Hier gilt dasselbe. Ist mir nur nicht aufgefallen, weil die bei mir eh aktiviert sind. Wäre das nicht so, hätte ich das ebenfalls angemerkt.

Grüße
Dalai

KodeZwerg 29. Jun 2020 11:35

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Danke für die Anregung mit dem Unicode Flag, das werde ich nachher mal testen und erstelle auch ein paar Photos (bevor ich mich falsch Ausdrücke) was passiert wenn man ohne Failsafe arbeitet.
Ich werde erst morgen die offenen Fragen beantworten können, bitte sei mir nicht böse und Dankeschön nochmal!

KodeZwerg 30. Jun 2020 07:30

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Liste der Anhänge anzeigen (Anzahl: 3)
Guten Morgen/Tag/Abend,

hier nun nochmal umgeschrieben so das mir Windows auch was dazu sagen kann...

Delphi-Quellcode:
procedure TMain.InvokeContextMenu(const Owner: TWinControl; const Path: String;
  const X, Y: Integer);
var
  Item: Integer;
  DeskFolder, Folder: IShellFolder;
  Eaten, Attributes: ULONG;
  pIdl, FolderpIdl: PItemIDList;
  ContextMenu: IContextMenu;
  ContextMenu2: IContextMenu2;
  Menu: HMENU;
  Pos: TPoint;
  Cmd: DWORD;
  CommandInfo: TCMInvokeCommandInfo;
begin
  OleCheck(SHGetDesktopFolder(DeskFolder));
  Attributes := 0;
  OleCheck(DeskFolder.ParseDisplayName(Handle, nil,
                    PWideChar(WideString(ExtractFilePath(Path))),
                    Eaten, FolderpIdl, Attributes));
  OleCheck(DeskFolder.BindToObject(FolderpIdl, nil, IID_IShellFolder, Folder));
  CoTaskMemFree(FolderpIdl);
  Attributes := 0;

(*

An dieser Stelle kommt Windows mit meiner Anfrage für Wurzelpfade nicht mehr weiter.

ExtractFileName(Path) hab ich mit 'C', 'C:', 'C:\' ausgetauscht um halt das Wurzelverzeichniss zu erhalten.
Das mag der so gar nicht als Wert haben wollen.
Entweder kommt ein Fehlerfenster mit Inhalt: "Falscher Parameter" oder "Das System kann die angegebene Datei nicht finden.

*)

  OleCheck(Folder.ParseDisplayName(INVALID_HANDLE_VALUE, nil,
            PWideChar(WideString(ExtractFileName(Path))), Eaten, PIDL, Attributes));

  OleCheck(Folder.GetUIObjectOf(Handle, 1, pIdl, IID_IContextMenu,
                                  nil, ContextMenu));
  CoTaskMemFree(pIdl);
  Menu := CreatePopupMenu;
  try
    OleCheck(ContextMenu.QueryContextMenu(Menu, 0, 1, $7FFF, CMF_EXPLORE));
    ContextMenu.QueryInterface(IID_IContextMenu2, ContextMenu2);
    try
      Pos.X := X;
      Pos.Y := Y;
      Winapi.Windows.ClientToScreen(Owner.Handle, Pos);
      Bool(Cmd) := TrackPopupMenu(Menu,
                            TPM_LEFTBUTTON or TPM_RIGHTBUTTON or TPM_RETURNCMD,
                            Pos.X, Pos.Y, 0, Handle, nil);
    finally
      ContextMenu2 := nil;
    end;
    if Bool(Cmd) then begin
      FillChar(CommandInfo, SizeOf(CommandInfo), 0);
      CommandInfo.cbSize := SizeOf(CommandInfo);
      CommandInfo.hwnd := Handle;
      CommandInfo.lpVerb := PAnsiChar(MakeIntResource(Cmd - 1));
      CommandInfo.nShow := SW_SHOWNORMAL;
      OleCheck(ContextMenu.InvokeCommand(CommandInfo));
    end;
  finally
    DestroyMenu(Menu);
  end;
end;
Cmd Variable hat bei mir vom Menupunkt "Eigenschaften" immer den Wert 20. (Also 20-1 = 19)

Anbei noch mal ein aktuelleres Kompilat wo nun auch ein Menu gemalt wird wenn man nichts ausgewählt hat.
Der obige Code ist dort verbaut.
Animationscode wurde entfernt, Schattencode betrifft nur meine Anwendung (DropShadow).

Die Fotos, das mit "Falscher Parameter" entstammt dem obigen Code, das mit dem bösen Fehler entstammt den alten Code wenn ich meine Sicherheitsabfragen entferne.

Dalai 30. Jun 2020 07:43

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Aus Interesse hab ich gestern deinen Code übernommen, etwas abgeändert, und damit rumgespielt. Wahrscheinlich kannst du auf die ganze relative Pfad-Geschichte - und damit die doppelte IShellFolder-Variable - verzichten, denn MS schreibt zu ParseDisplayName:
Zitat:

pszDisplayName

Type: LPWSTR

[...] The desktop folder, for instance, accepts paths such as "C:\My Docs\My File.txt".
Leider führte mich dieses Detail auch nicht weiter. Bei mir öffnet sich ebenfalls nur das Fenster mit den Systemeigenschaften, oder ich bekomme beim OleCheck ebenfalls "Falscher Parameter". Welcher Parameter da falsch sein soll, entzieht sich mir... Hätte ich mehr Ahnung in Bezug auf diese konkreten Interfaces und/oder die Kontextmenüs, oder hätte die selbst schon mal benutzt, könnte ich vielleicht helfen :(.

PS: Übrigens kannst du auf die Variablen Eaten und Attributes verzichten, wenn du stattdessen
Delphi-Quellcode:
Cardinal(nil^)
als Parameter reingibst (sofern du deren Werte nicht benötigst).

Grüße
Dalai

KodeZwerg 30. Jun 2020 09:19

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Bloß keine falsche Bescheidenheit, selbst wenn mein Eigentliches Problem immer noch da ist hast Du mir dennoch an anderer Stelle super weitergeholfen (Animation) und Tipps mit Umgang!
Ach ich liebe das Forum :kiss:
Deine Anregung den "DeskFolder" nicht zu nutzen, da komme ich gerade noch nicht ganz klar. So wie ich die MS-Docs da verstanden hatte leiten sich alle PIDLs davon ab, was ja auch funktioniert hat. Vielleicht habe ich Dich da auch missverstanden.
Wenn es keine Umstände bereitet, könntest Du mir bitte Deine Änderung zeigen?
Die ungenutzten Variablen bleiben ungenutzt, soll heißen auf "Cardinal(nil^)" werde ich umstellen. Dankeschön!

Dalai 30. Jun 2020 12:15

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Zitat:

Zitat von KodeZwerg (Beitrag 1468562)
Deine Anregung den "DeskFolder" nicht zu nutzen, da komme ich gerade noch nicht ganz klar. So wie ich die MS-Docs da verstanden hatte leiten sich alle PIDLs davon ab, was ja auch funktioniert hat. Vielleicht habe ich Dich da auch missverstanden.

OK, ich erkläre es mal anders. Bisher extrahierst du ja den Pfad des übergebenen Dateinamens, parst diesen und bindest ihn an die Variable DeskFolder. Anschließend machst du das gleiche mit dem reinen Dateinamen und der Variable Folder. Du nutzt also zweimal je ein IShellFolder Interface, und einen Dateinamen relativ zu seinem Pfad. Laut MS KB-Artikel soll ParseDisplayName - so mein Verständnis des zitierten Teils - auch mit absoluten Pfaden klarkommen, wenn man ihn mit dem Desktop-Verzeichnis füttert. Es sollte also ausreichen, wenn du eine Instanz von IShellFolder nutzt (DeskFolder) und dort gleich den vollen Pfad reinpackst und parsen lässt.

Ich hoffe, das war ausreichend klar erklärt. In meinen Änderungen hab ich sozusagen komplett auf die Variable Folder verzichtet (zum Test erstmal nur im Falle/Abschnitt des "Failsafes") und stattdessen DeskFolder verwendet.

Grüße
Dalai

KodeZwerg 30. Jun 2020 13:16

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Joah, die zweite, tiefere, andere, whatever :-] Erklärung hat mich erleuchtet, ich hatte verkehrt herum gedacht.
Ich werde es mal durchtesten wie Du beschrieben hast bzw eine dritte Variante die mir gerade beim Lesen/Schreiben in den Sinn gekommen ist.
Lösen wird was ich gerade im Hinterstübchen habe auch nicht mein Problem, aber der Gedanke Ballast loszuwerden ist immer Lobenswert :)

Dalai 22. Jul 2020 14:11

AW: windows eigenschaften-dialog für datenträger anzeigen lassen
 
Was ich vor einiger Zeit noch sagen wollte, und mir grad wieder einfiel: Vielleicht hat Christian Ghisler, der Autor des Total Commander, einen Ansatz für dich oder kann sagen, woran es klemmt. Schließlich funktioniert das Aufrufen der Eigenschaften im TC auch bei Laufwerken. Du kannst ihm z.B. eine Mail schreiben an support [bei] ghisler [punkt] com. Das hier ist zwar kein Supportfall, aber ich weiß aus eigener Erfahrung, dass er sich selbst für andere Dinge Zeit nimmt, auch wenn es manchmal etwas dauern kann.

Grüße
Dalai


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz