![]() |
Bezeichnungen von SpecialFoldern?
Weiß einer wie man üblicherweise an die Klarnamen für die SpecialFolder kommt? Gibt es da eine Funktion oder bedient man sich da des physikalischen Namens?
Bei XP scheint alles sowieso irgendwie noch landesspezifisch benannt zu sein. So heißt der Eigene Dateien Ordner physikalisch auch so. Bei Window 7 scheint das schon irgendwie anders zu sein. Ich frage deshalb, weil ich hier ein englischsprachiges Programm vor mir habe und dort gibt es eine ListBox mit einigen Spezialordnern. Nur haben alle Ordner dort englische Bezeichnungen, also z. B. My Documents für Eigene Dateien. Mich wundert es also, dass der Programmierer die englischen Bezeichnungen fest einprogrammiert hat, da man sie doch eigentlich als Ordnernamen auslesen kann. Dann aber gibt man CSIDL_INTERNET ein und es kommt nichts raus. CSIDL_INTERNET hat keinen Ordner (zumindest ist mir keiner bekannt). Auch hat CSIDL_DRIVES anscheinend keinen Ordner. Das ist meiner Kenntnis nach der Arbeitsplatz. Somit stellt sich die Frage wie man an diese Namen kommt? Kommt man bei den anderen Ordnern noch über den Ordnernamen an die Bezeichnung, wie kommt man an die Namen von Virtuellen Ordnern? |
AW: Bezeichnungen von SpecialFoldern?
Delphi-Quellcode:
Vielleicht damit?
uses
SysUtils, Windows, Forms, Graphics, Types, Classes, IniFiles, ... ActiveX, // IMalloc ShellAPI, // SHGetSpecialFolderLocation() und SHGetPathFromIDList() ShlObj; // CSIDL_-Konstanten {Einige Spezial-Folders: CSIDL_COOKIES Cookies CSIDL_DESKTOPDIRECTORY Desktop CSIDL_FAVORITES Favoriten CSIDL_HISTORY Internet-Verlauf CSIDL_INTERNET_CACHE "Temporary Internet Files" CSIDL_PERSONAL Eigene Dateien CSIDL_PROGRAMS "Programme" im Startmenü CSIDL_RECENT "Dokumente" im Startmenü CSIDL_SENDTO "Senden an" im Kontextmenü CSIDL_STARTMENU Startmenü CSIDL_STARTUP Autostart } function GetSpecialFolder(hWindow: HWND; Folder: Integer): String; var pMalloc: IMalloc; pidl: PItemIDList; Path: PChar; begin if (SHGetMalloc(pMalloc) <> S_OK) then Exit; SHGetSpecialFolderLocation(hWindow, Folder, pidl); GetMem(Path, MAX_PATH); SHGetPathFromIDList(pidl, Path); Result := Path; FreeMem(Path); pMalloc.Free(pidl); end; |
AW: Bezeichnungen von SpecialFoldern?
Und wieder das
![]() |
AW: Bezeichnungen von SpecialFoldern?
Zitat:
|
AW: Bezeichnungen von SpecialFoldern?
Dass sich mit fast jeder neuen Windows-Version die Vorgehensweise ändert. Aber wenn Du eine abstrakte :glaskugel: hast, ist das ja alles zu verschmerzen, solange die nicht auch irgendwann als deprecated gekennzeichnet wird.
|
AW: Bezeichnungen von SpecialFoldern?
Da ich diese Abstraktion vornehme müsste ich diese auf deprecated setzen.
|
AW: Bezeichnungen von SpecialFoldern?
Und die Abstraktion selbst müsste niemals mehr geändert werden, auch nicht, wenn Microsoft in Windows 10/11/12 alle bisherigen Funktionen als deprecated kennzeichnet und man stattdessen plötzlich SHGetVerySpecialFoldersWhichDidPossiblyNotExistInO lderWindows verwenden soll?
|
AW: Bezeichnungen von SpecialFoldern?
Zitat:
Hier mal ein Beispiel
Delphi-Quellcode:
unit AppPath;
interface type IAppPath = interface ['{00EF3178-EB41-49A3-9385-B3CB61CD0012}'] function DocumentRoot : string; end; TAppPath = class private class var FAppPath : IAppPath; public class procedure SetAppPathInstance( AAppPath : IAppPath ); class function DocumentRoot : string; end; implementation uses {$IFDEF WIN32}WinapiAppPath{$ENDIF} {$IFDEF WIN64}WinapiAppPath{$ENDIF} {$IFDEF OSX32}MacapiAppPath{$ENDIF} ; { TAppPath } class function TAppPath.DocumentRoot : string; begin Result := FAppPath.DocumentRoot; end; class procedure TAppPath.SetAppPathInstance( AAppPath : IAppPath ); begin FAppPath := AAppPath; end; end.
Delphi-Quellcode:
unit WinapiAppPath;
interface uses AppPath; implementation uses SysUtils, WinapiAppPathSpecialFolder, WinapiAppPathKnownFolder; function WinVersionMinVista : Boolean; begin Result := CheckWin32Version( 6, 0 ); end; initialization if WinVersionMinVista then TAppPath.SetAppPathInstance( TAppPathKnownFolder.Create ) else TAppPath.SetAppPathInstance( TAppPathSpecialFolder.Create ); end.
Delphi-Quellcode:
unit WinapiAppPathSpecialFolder;
interface uses AppPath; type TAppPathSpecialFolder = class( TInterfacedObject, IAppPath ) public function DocumentRoot : string; end; implementation uses Windows, ShellApi, ShlObj; function GetSpecialFolder( FolderID : longint ) : string; var Path : pchar; idList : PItemIDList; begin GetMem( Path, MAX_PATH ); SHGetSpecialFolderLocation( 0, FolderID, idList ); SHGetPathFromIDList( idList, Path ); Result := string( Path ); FreeMem( Path ); end; { TAppPathSpecialFolder } function TAppPathSpecialFolder.DocumentRoot : string; begin Result := GetSpecialFolder( CSIDL_MYDOCUMENTS ); end; end.
Delphi-Quellcode:
unit WinapiAppPathKnownFolder;
interface uses AppPath; type TAppPathKnownFolder = class( TInterfacedObject, IAppPath ) public function DocumentRoot : string; end; implementation uses SysUtils, Windows, ShlObj; function GetKnownFolder( const FolderID : TGUID ) : string; var LPath : PChar; begin if SHGetKnownFolderPath( FolderID, 0, 0, LPath ) >= 0 then Result := LPath else Result := #0; end; { TAppPathKnownFolder } function TAppPathKnownFolder.DocumentRoot : string; begin Result := GetKnownFolder( StringToGUID( '{FDD39AD0-238F-46AF-ADB4-6C85480369C7}' ) ); end; end. |
AW: Bezeichnungen von SpecialFoldern?
So, nochmal zum Mitschreiben: wenn sich die API ändert und plötzlich alle bislang benutzten Funktionen deprecated sind, muss man doch eine neue OS-Abfrage einbauen und dann die Funktion benutzen, die Microsoft vorgibt, ob abstrahiert oder nicht. Sonst läuft man möglicherweise Gefahr, dass das ganze Gezumpel entweder gar nicht mehr funktioniert oder aber falsche Ergebnisse liefert. Und nur darauf wollte ich hinaus.
|
AW: Bezeichnungen von SpecialFoldern?
Ja, genauso wie jedes Auto nicht mehr fährt, wenn der Betriebsstoff alle ist.
Ein heute geschriebenes Programm wird nur so lange laufen, wie alle heute geltenden und benutzten Schnittstellen noch vorhanden sind. Mit einer Abstraktion erreiche ich aber eine schnelle und einfache Apassung an neue Gegebenheiten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:31 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 by Thomas Breitkreuz