AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Groß/Kleinschreibung (Pfad) Original erhalten?
Thema durchsuchen
Ansicht
Themen-Optionen

Groß/Kleinschreibung (Pfad) Original erhalten?

Ein Thema von MicMic · begonnen am 18. Aug 2018 · letzter Beitrag vom 1. Okt 2018
 
MicMic

Registriert seit: 26. Mai 2018
296 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#16

AW: Groß/Kleinschreibung (Pfad) Original erhalten?

  Alt 29. Sep 2018, 18:15
Nun habe ich eine Lösung.
Delphi-Quellcode:
uses
  ActiveX, ShlObj, SHDocVw, ComObj;

function PathToPIDL(const Path: string): PItemIDList;
const
  SFGAO_STREAM = $00400000;
var
  Count: ULONG;
  Attributes: ULONG;
  ShellFolder: IShellFolder;
begin
  OleCheck(SHGetDesktopFolder(ShellFolder));
  Attributes := SFGAO_FOLDER or SFGAO_STREAM;
  OleCheck(ShellFolder.ParseDisplayName(0, nil, PWideChar(WideString(Path)), Count, Result, Attributes));
  if not ((Attributes and SFGAO_FOLDER = SFGAO_FOLDER) and (Attributes and SFGAO_STREAM <> SFGAO_STREAM)) then
   begin
     CoTaskMemFree(Result);
     raise Exception.Create('Could not convert string to PIDL');
   end;
end;

function PIDLToPath(const PIDL: PItemIDList): string;
var
  Path: array[0..Max_Path] of Char;
begin
  if ShGetPathFromIDList(PIDL, Path) then
   Result := Path
   else raise Exception.Create('Could not convert PIDL to string');
end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
  s: string;
  PIDL: PItemIDList;
begin
  s := 'c:\uSERs\PUBlic\DeskTop';
  PIDL := PathToPIDL(s);
  s := PIDLToPath(PIDL);
  Memo1.Lines.Add(S);
end;
Zitat:
C:\Users\Public\Desktop
Viel Spass damit.

ps: Bearbeite das Uses, kann sein das da zuviel steht.
Hallo, wenn du dich erinnern kannst...
An der Funktion (bzw. an meine Funktion die ich entsprechend für meine Bedürfnisse abgeändert habe <- nachfolgender Code), bin ich gerade noch am rumwerkeln.
Code:
Function PathToCS(Const Path: UnicodeString): UnicodeString;
Var
  Count: ULONG;
  Attrs: ULONG;
  ShellFolder: IShellFolder;
  Pa: Array[0..Max_Path] Of Char;
  Pidl: PItemIDList;
Begin
  Attrs := SFGAO_FOLDER or SFGAO_STREAM;
  Count := 0;
  If SHGetDesktopFolder(ShellFolder) = S_OK Then
  Begin
    If ShellFolder.ParseDisplayName(0,Nil,PWideChar(Path),Count,Pidl,Attrs) = S_OK Then
    Begin
      If SHGetPathFromIDList(Pidl, Pa)
        Then Result := IncludeTrailingPathDelimiter(Pa)
        Else Result := IncludeTrailingPathDelimiter(Path);
      CoTaskMemFree(Pidl);
    End Else Result := IncludeTrailingPathDelimiter(Path);
  End Else Result := IncludeTrailingPathDelimiter(Path);
End;
Ich probiere nämlich bei langen Verzeichnissen dies auch so zu lösen. Versuche mich an "SHGetPathFromIDListW" (anstatt "SHGetPathFromIDList" (ohne W)). Aber was ich auch mache, sobald mehr als 260 (glaub ich) Zeichen im Pfad sind (z.B. C:\Test\UnterOrdner\Unter\ganzvielunter\...\...\.. .), bekomme ich kurze Pfade zurück geliefert. Also z.B. diese "ICHGEH~1" verkürzten Namen. Hier im Pfad am Anfang "\\?\" anzuhängen klappt erst recht nicht.

Meine Versuche für den 2. Parameter für "SHGetPathFromIDListW":
Code:
Var Pa: PWideChar; // zuvor "Array[0..Max_Path] Of Char;"

const
  NTFS_MAX_PATH = 32767;

GetMem(Pa, (NTFS_MAX_PATH + 1) * 2);

If SHGetPathFromIDListW (Pidl, Pa)
...
Aber so geht das einfach nicht.

Vielleicht hast du (oder jemand anderes) eine Idee?

Micha
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz