Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Unit zur Verwendung von SHGetKnownFolderPath (https://www.delphipraxis.net/135471-unit-zur-verwendung-von-shgetknownfolderpath.html)

ringli 11. Jun 2009 14:00


Unit zur Verwendung von SHGetKnownFolderPath
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wie einige sicher wissen hat sich in Vista (und höher) die Ermittlung von Systemordnern geändert. Ab Vista sollte zur Ermittlung von Systemordnern nur noch die Funktion SHGetKnownFolderPath verwendet werden. Die bisher verwendete Funktion SHGetFolderPath und die CSIDL-Konstanten sind nur noch aus Kompatibilitätsgründen vorhanden. Da ich bisher keine komplette Delphi-Implementation gefunden habe, habe ich die angehängte Unit erstellt. Vielleicht kann der ein oder andere sie gebrauchen. :)

Die Verwendung der Unit ist einfach:
Delphi-Quellcode:
uses
   ...uGetKnownFolderPath;

.
.
.
procedure TForm1.Button1Click(Sender: TObject);
var
  ws : WideString;
begin
  ws := GetKnownFolderPath(FOLDERID_Windows);
  ShowMessage(ws);
end;
Dieser Aufruf gibt bspw. C:\Windows zurück. Die Bedeutung der einzelnen FOLDERID's kann im MSDN nachgelesen werden.

DP-Maintenance 11. Jun 2009 18:42

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Windows API / MS.NET Framework API" nach "Neuen Beitrag zur Code-Library hinzufügen" verschoben.
Das ist was für die Code-Library.

p80286 13. Jul 2016 14:13

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
@ringli
Vielen dank, daß Du Dir die Mühe gemacht hast, jetzt kann ich doch noch ein wenig bei D7 bleiben.:thumb:

Gruß
K-H

ringli 26. Sep 2016 17:56

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe die Unit mal aktualisiert so das jetzt auch die neueren Folder-ID's enthalten sind.

Fritzew 27. Sep 2016 10:57

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Hallo Ringli

Danke für die Unit,

aber eine Anmerkung: Dein Code gibt den Speicher nicht frei.


Ich habe es so geändert:

Delphi-Quellcode:
function GetKnownFolderPath(const rfid: TGUID): string;
var
  OutPath : PWideChar;
begin
  if ShGetKnownFolderPath(rfid, 0, 0, OutPath) {>= 0} = S_OK then
    begin
      Result := OutPath;
//   From MSN
//     ppszPath [out]
//     Type: PWSTR*
//     When this method returns, contains the address of a pointer to a null-terminated Unicode string that specifies the path of the known folder
//     The calling process is responsible for freeing this resource once it is no longer needed by calling CoTaskMemFree.
//      The returned path does not include a trailing backslash. For example, "C:\Users" is returned rather than "C:\Users\".
      CoTaskMemFree(OutPath);
    end
  else
    begin
      Result := '';
    end;
end;
Benötigt auch noch die WinApi.ActiveX im uses.

ringli 27. Sep 2016 11:43

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Danke für den Hinweis. Habe den Anhang entsprechend aktualisiert.

Fritzew 27. Sep 2016 11:47

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Du musst aber die Funktion noch auf Rückgabe String ändern.......
Dein Result zeigt auf den freigegebenen Speicher :-D

Delphi-Quellcode:
function GetKnownFolderPath(const rfid: TGUID) : string;  // Hier

PeterPanino 17. Sep 2018 11:05

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
In einem anderen Forum sagte jemand, man solle in diesem Zusammenhang eher
Delphi-Quellcode:
Winapi.Ole2.CoTaskMemFree
statt
Delphi-Quellcode:
Winapi.ActiveX.CoTaskMemFree
verwenden.

Was haltet ihr davon?

KodeZwerg 17. Sep 2018 11:26

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Zitat:

Zitat von PeterPanino (Beitrag 1413351)
In einem anderen Forum sagte jemand, man solle in diesem Zusammenhang eher
Delphi-Quellcode:
Winapi.Ole2.CoTaskMemFree
statt
Delphi-Quellcode:
Winapi.ActiveX.CoTaskMemFree
verwenden.

Was haltet ihr davon?

Gar nichts, aber wenn man Dateigröße sparen mag und nur das CoTaskMemFree benötigt ohne Zusatz Units einzubinden die die .exe aufblähen, nutze ich die Api direkt
Delphi-Quellcode:
procedure CoTaskMemFree(pv: Pointer); stdcall; external 'ole32.dll';

PeterPanino 17. Sep 2018 11:40

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Zitat:

Zitat von KodeZwerg (Beitrag 1413354)
Gar nichts

Das sind wir von dir ja gewohnt.

Sparen ist zwar allgemein ein gutes Argument (der Weltspartag findet alljährlich in der letzten Oktoberwoche statt), das aber nicht die Frage selbst beantwortet, obwohl diese von dir ausdrücklich zitiert wurde.

Bitte gehe nächstes Mal auf die Fragen bzw. auf die Kommentare der Benutzer ein.

Zacherl 17. Sep 2018 12:56

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Denke was er damit sagen wollte ist, dass es faktisch keinen Unterschied macht. An beiden Stellen wird die gleiche Funktion mit identischer Signatur und allem drum und dran aus der `ole32.dll` importiert.

KodeZwerg 17. Sep 2018 16:54

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Zitat:

Zitat von Zacherl (Beitrag 1413370)
Denke was er damit sagen wollte ist, dass es faktisch keinen Unterschied macht. An beiden Stellen wird die gleiche Funktion mit identischer Signatur und allem drum und dran aus der `ole32.dll` importiert.

Danke und ja.

Hobbycoder 17. Sep 2018 17:38

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Zitat:

Zitat von PeterPanino (Beitrag 1413356)
Das sind wir von dir ja gewohnt.

…, das aber nicht die Frage selbst beantwortet, obwohl diese von dir ausdrücklich zitiert wurde.

Bitte gehe nächstes Mal auf die Fragen bzw. auf die Kommentare der Benutzer ein.

Kannst du dir sowas nicht mal schenken, langsam nervt's. :stupid: Eure Unstimmigkeiten sind bekannt. Und solche Spitzen heizen die Gemüter nur wieder unnötigerweise an.
Das hat mal so gar nichts mit Delphi zu tun und gehört hier einfach nicht hin.

PeterPanino 17. Sep 2018 23:08

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Zitat:

Zitat von Hobbycoder (Beitrag 1413408)
Zitat:

Zitat von PeterPanino (Beitrag 1413356)
Das sind wir von dir ja gewohnt.

…, das aber nicht die Frage selbst beantwortet, obwohl diese von dir ausdrücklich zitiert wurde.

Bitte gehe nächstes Mal auf die Fragen bzw. auf die Kommentare der Benutzer ein.

Kannst du dir sowas nicht mal schenken, langsam nervt's. :stupid: Eure Unstimmigkeiten sind bekannt. Und solche Spitzen heizen die Gemüter nur wieder unnötigerweise an.
Das hat mal so gar nichts mit Delphi zu tun und gehört hier einfach nicht hin.

Du hast recht. Aber wieso sagst du das nicht dem Anderen. Dessen Spitzen sind um einiges schärfer.

Eigentlich ist das Ganze ja höchst kindisch. Ich weiß nicht, wieso ich mich darauf eingelassen habe, ich mache sowas sonst eigentlich nicht. Aber es würde mir helfen, wenn ihr nicht nur auf mir herumhacken, sondern auch seine Anpatzer abmahnen würdet. So, das war jetzt wieder äußerst kindisch. Aber ich habe mal das Bedürfnis, ehrlich zu sein, auch wenn es sich kindisch anhört.

KodeZwerg 18. Sep 2018 00:12

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Ausgangslage:
Zitat:

Zitat von KodeZwerg (Beitrag 1413354)
Zitat:

Zitat von PeterPanino (Beitrag 1413351)
In einem anderen Forum sagte jemand, man solle in diesem Zusammenhang eher
Delphi-Quellcode:
Winapi.Ole2.CoTaskMemFree
statt
Delphi-Quellcode:
Winapi.ActiveX.CoTaskMemFree
verwenden.

Was haltet ihr davon?

Gar nichts, aber wenn man Dateigröße sparen mag und nur das CoTaskMemFree benötigt ohne Zusatz Units einzubinden die die .exe aufblähen, nutze ich die Api direkt
Delphi-Quellcode:
procedure CoTaskMemFree(pv: Pointer); stdcall; external 'ole32.dll';

...Ich blieb sachlich, aber da die Frage war obs besser ist die Milch im Kaffee rechts- oder linksrum zu drehen ist mein Argument dazu: Es ist Wurst und einen Tipp dazu habe ich auch geliefert.

Deine Reaktion darauf:
Zitat:

Zitat von PeterPanino (Beitrag 1413356)
Das sind wir von dir ja gewohnt.

Sparen ist zwar allgemein ein gutes Argument (der Weltspartag findet alljährlich in der letzten Oktoberwoche statt), das aber nicht die Frage selbst beantwortet, obwohl diese von dir ausdrücklich zitiert wurde.

Bitte gehe nächstes Mal auf die Fragen bzw. auf die Kommentare der Benutzer ein.

Da Deine Frage beantwortet war, ich niemand angemacht, gedemütigt, beleidigt oder sonst eine Anspielung getan wurde...
...ich hätte ja auch Schreiben können "Weltspartag? WTF? Was geht da wieder im Nimmerland ab...." Das hat nichts mit Delphi am Hut.

also obwohl ich nichts weiter schrieb zu Dir bzw Dich betreffend, kommt nun:
Zitat:

Zitat von PeterPanino (Beitrag 1413433)
Zitat:

Zitat von Hobbycoder (Beitrag 1413408)
Zitat:

Zitat von PeterPanino (Beitrag 1413356)
blablah siehe oben

Kannst du dir sowas nicht mal schenken, langsam nervt's. :stupid: Eure Unstimmigkeiten sind bekannt. Und solche Spitzen heizen die Gemüter nur wieder unnötigerweise an.
Das hat mal so gar nichts mit Delphi zu tun und gehört hier einfach nicht hin.

Du hast recht. Aber wieso sagst du das nicht dem Anderen. Dessen Spitzen sind um einiges schärfer.

Eigentlich ist das Ganze ja höchst kindisch. Ich weiß nicht, wieso ich mich darauf eingelassen habe, ich mache sowas sonst eigentlich nicht. Aber es würde mir helfen, wenn ihr nicht nur auf mir herumhacken, sondern auch seine Anpatzer abmahnen würdet. So, das war jetzt wieder äußerst kindisch. Aber ich habe mal das Bedürfnis, ehrlich zu sein, auch wenn es sich kindisch anhört.

>>>sondern auch seine Anpatzer abmahnen würdet.
Jetzt habe ich völlig den Faden verloren.
War jetzt "Gar nichts" beleidigend? War der Tipp beleidigend? Sind Deine merkwürdigen nicht-Delphi bezogenen Sätze beleidigend?

Ganz ehrlich, mir sind Deine Antworten darauf egal, bitte verkneife Dir darauf zu reagieren, andere Leser könnten wenigstens vom Tipp profitieren, also der WinApi Tipp (da das Delphi betrifft und dies ein Super Forum für eben dieses ist) nicht Dein Weltspartag Zitat.

Hier rauch ne Friedenspfeife mit mir und Versuche meine Texte weder falsch zu verstehen noch offtopic (nicht Delphi bezogen) zu Zitieren.

Von daher meine Bitte, bleib in Zukunft beim Thema Delphi, wenn Du gewisse Dinge nicht verstehen solltest weil Du noch nicht bereit dazu bist, da kann Dir geholfen werden. Wenn Du die Hilfe als unangebracht empfindest und daraus nur wieder 4/5 Seiten Stänkerei entsteht, darauf habe ich (und wahrscheinlich andere Leser) keine Lust mehr, aber man könnte ja erneut nachfragen wenn man etwas nicht versteht bevor jedes einzelne Wort auf die Waage gelegt wird und merkwürdige Zitate daraus entstehen.

MicMic 18. Sep 2018 14:28

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
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

Luckie 18. Sep 2018 14:49

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Wie oft muss man euch beide eigentlich noch ermahnen! :evil:

Ich hoffe mit dem letzten Beitrag wird wieder zum Thema zurückgefunden.

KodeZwerg 18. Sep 2018 17:28

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Zitat:

Zitat von MicMic (Beitrag 1413486)
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
Zitat:

Zitat von Luckie (Beitrag 1413488)
Wie oft muss man euch beide eigentlich noch ermahnen! :evil:

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 :wink:

MicMic 18. Sep 2018 18:00

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
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

KodeZwerg 18. Sep 2018 18:10

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Zitat:

Zitat von MicMic (Beitrag 1413508)
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!

KodeZwerg 18. Sep 2018 18:19

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
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;

EWeiss 18. Sep 2018 18:29

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Wenn schon denn schon..
CreateFileW(PWideChar(...

gruss

KodeZwerg 18. Sep 2018 18:37

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Zitat:

Zitat von EWeiss (Beitrag 1413514)
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.dll' name {$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;

MicMic 19. Sep 2018 14:13

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Danke für's coden
Micha

DeddyH 19. Sep 2018 14:40

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Meistens kommt man aber auch mit einem einzigen IFDEF aus:
Delphi-Quellcode:
  function GetFinalPathNameByHandle(hFile: THandle; lpszFilePath: PChar; cchFilePath: DWORD; dwFlags: DWORD): DWORD; stdcall;
  external 'Kernel32.dll' name {$IFDEF UNICODE}'GetFinalPathNameByHandleW'{$ELSE}'GetFinalPathNameByHandleA'{$ENDIF};
Und dann benutzt man nur noch den Alias GetFinalPathNameByHandle, sollte automatisch passen.

KodeZwerg 19. Sep 2018 15:16

AW: Unit zur Verwendung von SHGetKnownFolderPath
 
Zitat:

Zitat von MicMic (Beitrag 1413637)
Danke für's coden
Micha

Gerne doch.:wink:
Zitat:

Zitat von DeddyH (Beitrag 1413651)
Meistens kommt man aber auch mit einem einzigen IFDEF aus

Dankeschön für Tipp, habe Code oben geupdatet.:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 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