Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Pfad mit GUID (KnownFolderId) umwandeln in vollen Pfad (https://www.delphipraxis.net/188953-pfad-mit-guid-knownfolderid-umwandeln-vollen-pfad.html)

CodeX 23. Apr 2016 15:47

AW: Pfad mit GUID (KnownFolderId) umwandeln in vollen Pfad
 
Zitat:

Zitat von Zacherl (Beitrag 1336454)
Du verstehst das eigentliche "Problem" nicht. Wie er die GUID in den eigentlichen Pfad umwandeln kann, weiß er. Die Frage ist eigentlich nur, ob es eine API gibt, die dies analog zu MSDN-Library durchsuchenExpandEnvironmentStrings auch direkt mit zusammengesetzten Strings machen kann.

Danke.

SHGetKnownFolderPath hatte ich ja schon im Eingangsposting erwähnt und das ist auch kein Problem - man muss aber eben "drumherum arbeiten": Zerlegen, GUID prüfen/umwandeln und wieder zusammensetzen. Wenn es aber ein Pendant zu ExpandEnvironmentStrings (was den String als Ganzes nimmt) gäbe, würde ich das bevorzugen, weil es einfach die sauberere Lösung wäre. Da es für mich naheliegend war, dass es sowas geben müsste, ich es aber nicht gefunden hatte, habe ich hier nachgefragt, ob jemand sowas kennt.

Sir Rufo 23. Apr 2016 17:28

AW: Pfad mit GUID (KnownFolderId) umwandeln in vollen Pfad
 
Delphi-Quellcode:
ExpandEnvironmentStrings
löst quasi Makros auf, die auch an jeder beliebigen Stelle im Text auftauchen können.

Die CSIDL oder (neuer) KnownFolder können nur am Anfang auftauchen. Aus dem Grund gibt es wohl keine vorgefertigten API-Aufruf der diese Werte dann ersetzt.

Sind aber auch nur eine gute Handvoll Zeilen um das zu bewerkstelligen.

CodeX 23. Apr 2016 18:45

AW: Pfad mit GUID (KnownFolderId) umwandeln in vollen Pfad
 
Danke für die Zusatzinfos!

Ich habe mir das jetzt mal so zusammengebastelt, dass ich eine universelle Funktion habe, um Pfade vollständig umzuwandeln.

Falls es noch jemand brauchen kann:

Delphi-Quellcode:
function ExpandPath(const sPath: String): String;
var
  chrBuffer: LPWSTR;
  chrOut: array[0..1023] of Char;
  sGUID, sRest: String;
  GUID: TGUID;
begin
  Result := sPath;

  if AnsiStartsText('{', Result) and isWinVistaOrLater then
  begin
    sGUID := Copy(Result, 0, Pos('}',Result)); //z.B. '{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}' = 'C:\Program Files (x86)'
    sRest := Copy(Result, Pos('}',Result)+1, Length(Result));
    try
      GUID := StringToGUID(sGUID);
      if Succeeded(SHGetKnownFolderPath(GUID, 0, 0, chrBuffer)) then
      begin
        try
          Result := chrBuffer + sRest;
        finally
          CoTaskMemFree(chrBuffer);
        end;
      end;
    except
    end;
  end;

  if AnsiContainsText(Result,'%') then
  begin
    if ExpandEnvironmentStrings(PChar(Result), chrOut, 1024) > 0 then
      Result := chrOut;
  end;

  Result := Trim(Result);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.
Seite 2 von 2     12   

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