Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Bezeichnungen von SpecialFoldern? (https://www.delphipraxis.net/177722-bezeichnungen-von-specialfoldern.html)

Popov 23. Nov 2013 12:26

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?

Progman 23. Nov 2013 12:38

AW: Bezeichnungen von SpecialFoldern?
 
Delphi-Quellcode:
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;
Vielleicht damit?

DeddyH 23. Nov 2013 12:43

AW: Bezeichnungen von SpecialFoldern?
 
Und wieder das Microsoft-Wirrwarr :roll:

Sir Rufo 23. Nov 2013 13:24

AW: Bezeichnungen von SpecialFoldern?
 
Zitat:

Zitat von DeddyH (Beitrag 1237171)
Und wieder das Microsoft-Wirrwarr :roll:

Und wo ist jetzt das Problem, das man mit ein bisschen Abstraktion nicht lösen kann?

DeddyH 23. Nov 2013 14:34

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.

Sir Rufo 23. Nov 2013 14:40

AW: Bezeichnungen von SpecialFoldern?
 
Da ich diese Abstraktion vornehme müsste ich diese auf deprecated setzen.

DeddyH 23. Nov 2013 15:27

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?

Sir Rufo 23. Nov 2013 15:57

AW: Bezeichnungen von SpecialFoldern?
 
Zitat:

Zitat von DeddyH (Beitrag 1237179)
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?

Du hast den Sinn der Abstraktion beschrieben :thumb:

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.

DeddyH 23. Nov 2013 17:13

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.

Sir Rufo 23. Nov 2013 19:07

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 16:47 Uhr.
Seite 1 von 2  1 2      

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