AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Unit zur Verwendung von SHGetKnownFolderPath
Thema durchsuchen
Ansicht
Themen-Optionen

Unit zur Verwendung von SHGetKnownFolderPath

Ein Thema von ringli · begonnen am 11. Jun 2009 · letzter Beitrag vom 19. Sep 2018
Antwort Antwort
MicMic

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

AW: Unit zur Verwendung von SHGetKnownFolderPath

  Alt 18. Sep 2018, 14:28
Es hat ja ein wenig damit zu tun (SHGetKnownFolderPath).
Geht das auch irgendwie andersrum? Ich habe z.B. "C:\Programme" und möchte den wirklichen Ordner ermitteln. Also hier dann "C:\Program Files".
Geht das irgendwie?

Gruß
Micha
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Unit zur Verwendung von SHGetKnownFolderPath

  Alt 18. Sep 2018, 14:49
Wie oft muss man euch beide eigentlich noch ermahnen!

Ich hoffe mit dem letzten Beitrag wird wieder zum Thema zurückgefunden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Unit zur Verwendung von SHGetKnownFolderPath

  Alt 18. Sep 2018, 17:28
Es hat ja ein wenig damit zu tun (SHGetKnownFolderPath).
Geht das auch irgendwie andersrum? Ich habe z.B. "C:\Programme" und möchte den wirklichen Ordner ermitteln. Also hier dann "C:\Program Files".
Geht das irgendwie?

Gruß
Micha
Ich mache es so:
Delphi-Quellcode:
// kann sein das Dein Delphi die zwei Zeilen schon in Windows.pas hat, dann wegmachen.
const FILE_NAME_NORMALIZED = $0;
Function GetFinalPathNameByHandleA(hFile: THandle; lpszFilePath: LPSTR; cchFilePath: DWORD; dwFlags: DWORD): DWORD; stdcall; external 'Kernel32.dll';

function _FileGetSymLinkTarget( const APathToLink : string; var ATarget : string ) : boolean;
  var
    LinkHandle: THandle;
    TargetName: array [0..OFS_MAXPATHNAME-1] of AnsiChar;
  begin
    ATarget := '';
    LinkHandle := CreateFile( PChar(APathToLink), 0, FILE_SHARE_READ, nil,
        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
    Win32Check(LinkHandle <> INVALID_HANDLE_VALUE);
    try
      Result := GetFinalPathNameByHandleA(LinkHandle, @TargetName, OFS_MAXPATHNAME, FILE_NAME_NORMALIZED) > 0;
      if Result then
        begin
        ATarget := TargetName;
        if Pos( '\\?\UNC\', ATarget ) = 1 then
           begin
           Delete( ATarget, 1, 8 );
           Insert( '\\', ATarget, 1 );
           end
          else
          if Pos( '\\?\', ATarget ) = 1 then
             Delete( ATarget, 1, 4 );
        end;
    finally
      CloseHandle(LinkHandle);
    end;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  s: String;
begin
  s := '';
  _FileGetSymLinkTarget('c:\programme',s);
  ShowMessage(s);
end;
Zitat:
C:\Program Files
Wie oft muss man euch beide eigentlich noch ermahnen!

Ich hoffe mit dem letzten Beitrag wird wieder zum Thema zurückgefunden.
Verzeih mir und ich hoffe mit diesem Beitrag Deinen Wunsch Sinngemäß umgesetzt zu haben
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
MicMic

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

AW: Unit zur Verwendung von SHGetKnownFolderPath

  Alt 18. Sep 2018, 18:00
hihi... habe zeitgleich auch "GetFinalPathNameByHandle" gefunden und was probiert und wollte gleich mal hier nachfragen, ob man sich auf dieses "\\?\" (was mit übergeben wird) verlassen kann?
Aber deine Funktion nehme ich gerne. Dankeschön

Was ich auch noch nicht so ganz begreife... mit diesem "A" und "W" bei Funktionen.

Also "GetFinalPathNameByHandleA". Es gibt auch "W". Ich glaube A für Ansi und W für WideString? Da muss man wohl je nach aktion/nutzen die richtigen Funktionen wählen? Gerade wegen Dateinamen etc. nutze ich dann z.B. "FindFirstFileW". So ganz bin ich da noch nicht durch (wieso, weshalb, warum) aber bei mir gehen dann schon mal auch chinesische/japanische/russische Dateinamen. Na am Ende muss man das wohl dann alles durchtesten.

Gruß
Micha
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Unit zur Verwendung von SHGetKnownFolderPath

  Alt 18. Sep 2018, 18:10
hihi... habe zeitgleich auch "GetFinalPathNameByHandle" gefunden und was probiert und wollte gleich mal hier nachfragen, ob man sich auf dieses "\\?\" (was mit übergeben wird) verlassen kann?
Aber deine Funktion nehme ich gerne. Dankeschön

Was ich auch noch nicht so ganz begreife... mit diesem "A" und "W" bei Funktionen.

Also "GetFinalPathNameByHandleA". Es gibt auch "W". Ich glaube A für Ansi und W für WideString? Da muss man wohl je nach aktion/nutzen die richtigen Funktionen wählen? Gerade wegen Dateinamen etc. nutze ich dann z.B. "FindFirstFileW". So ganz bin ich da noch nicht durch (wieso, weshalb, warum) aber bei mir gehen dann schon mal auch chinesische/japanische/russische Dateinamen. Na am Ende muss man das wohl dann alles durchtesten.

Gruß
Micha
Ich habe bei Microsoft nur diese Api gefunden. Wenn es eine Wide Version gibt, dann unbedingt die bevorziehen! Unicode und so. Ja, das A am Ende steht für Ansi, deswegen AnsiChar im Code. Unicode hat dann alle characters, also W.
Ich schreibe mal mein Code für Wide um und teste, meine Windows.pas kennt halt gar keine von denen (Delphi 2019) und Microsoft sagte mir nix von einer W... oder ich habs überlesen, dann sorry!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Unit zur Verwendung von SHGetKnownFolderPath

  Alt 18. Sep 2018, 18:19
Schnell rumgewurschtelt, nun sollte es Unicode sein?
Delphi-Quellcode:
const FILE_NAME_NORMALIZED = $0;
//Function GetFinalPathNameByHandleA(hFile: THandle; lpszFilePath: LPSTR; cchFilePath: DWORD; dwFlags: DWORD): DWORD; stdcall; external 'Kernel32.dll';
Function GetFinalPathNameByHandleW(hFile: THandle; lpszFilePath: LPWSTR; cchFilePath: DWORD; dwFlags: DWORD): DWORD; stdcall; external 'Kernel32.dll';

function _FileGetSymLinkTarget( const APathToLink : string; var ATarget : string ) : boolean;
  var
    LinkHandle: THandle;
    TargetName: array [0..OFS_MAXPATHNAME-1] of WideChar;
  begin
    ATarget := '';
    LinkHandle := CreateFileW( PWideChar(APathToLink), 0, FILE_SHARE_READ, nil,
        OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
    Win32Check(LinkHandle <> INVALID_HANDLE_VALUE);
    try
      Result := GetFinalPathNameByHandleW(LinkHandle, @TargetName, OFS_MAXPATHNAME, FILE_NAME_NORMALIZED) > 0;
      if Result then
        begin
        ATarget := TargetName;
        if Pos( '\\?\UNC\', ATarget ) = 1 then
           begin
           Delete( ATarget, 1, 8 );
           Insert( '\\', ATarget, 1 );
           end
          else
          if Pos( '\\?\', ATarget ) = 1 then
             Delete( ATarget, 1, 4 );
        end;
    finally
      CloseHandle(LinkHandle);
    end;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  s: String;
begin
  s := '';
  _FileGetSymLinkTarget('c:\programme',s);
  ShowMessage(s);
end;
Gruß vom KodeZwerg

Geändert von KodeZwerg (18. Sep 2018 um 18:40 Uhr) Grund: Danke an EWeiss für Meldung
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Unit zur Verwendung von SHGetKnownFolderPath

  Alt 18. Sep 2018, 18:29
Wenn schon denn schon..
CreateFileW(PWideChar(...

gruss
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Unit zur Verwendung von SHGetKnownFolderPath

  Alt 18. Sep 2018, 18:37
Wenn schon denn schon..
CreateFileW(PWideChar(...

gruss
Ich wusste doch da war noch was, Dankeschön!

edit
So vielleicht auch für ältere Delphis.
Delphi-Quellcode:
const FILE_NAME_NORMALIZED = $0;
function GetFinalPathNameByHandle(hFile: THandle; lpszFilePath: PChar; cchFilePath: DWORD; dwFlags: DWORD): DWORD; stdcall;
         external 'Kernel32.dllname {$IFDEF UNICODE}'GetFinalPathNameByHandleW'{$ELSE}'GetFinalPathNameByHandleA'{$ENDIF};

function _FileGetSymLinkTarget( const APathToLink : string; var ATarget : string ) : boolean;
  var
    LinkHandle: THandle;
    TargetName: array [0..OFS_MAXPATHNAME-1] of {$IFDEF UNICODE}WideChar{$ELSE}AnsiChar{$ENDIF};
  begin
    ATarget := '';
    LinkHandle := CreateFile( {$IFDEF UNICODE}PWideChar{$ELSE}PAnsiChar{$ENDIF}
                               (APathToLink), 0, FILE_SHARE_READ, nil,
                               OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
    Win32Check(LinkHandle <> INVALID_HANDLE_VALUE);
    try
        Result := GetFinalPathNameByHandle(LinkHandle, @TargetName, OFS_MAXPATHNAME, FILE_NAME_NORMALIZED) > 0;
      if Result then
        begin
        ATarget := TargetName;
        if Pos( '\\?\UNC\', ATarget ) = 1 then
           begin
           Delete( ATarget, 1, 8 );
           Insert( '\\', ATarget, 1 );
           end
          else
          if Pos( '\\?\', ATarget ) = 1 then
             Delete( ATarget, 1, 4 );
        end;
    finally
      CloseHandle(LinkHandle);
    end;
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  s: String;
begin
  s := '';
  _FileGetSymLinkTarget('c:\programme',s);
  ShowMessage(s);
end;
Gruß vom KodeZwerg

Geändert von KodeZwerg (19. Sep 2018 um 15:13 Uhr) Grund: Danke an DeddyH für Meldung
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:40 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