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/)
-   -   StringToKnownFolder gesucht (https://www.delphipraxis.net/169615-stringtoknownfolder-gesucht.html)

blablab 1. Aug 2012 02:48

StringToKnownFolder gesucht
 
Hallo!

Ich würde gerne einen String in den entsprechenden Windows-Pfad verwandeln. Also wenn der Benutzer zum Beispiel SendTo angibt hätte ich gerne als ergebnis den SendTo Pfad "C:\Documents and Settings\username\SendTo" (oder wie auch immer der Pfad auf dem aktuellen System heißt).
Das ganze soll dann für möglichst viele Strings funktionieren wie zb SendTo, StartMenu, MyDocuments/Music/Pictures, Desktop, ...
Wie genau diese Strings definiert sind ist nicht so wichtig, hauptsache sie sind einigermaßen intuitiv. Ob das jetzt zum Beispiel MyDocuments heißt oder nur Documents ist egal, aber {7B0DB17D-9CD2-4A93-9733-46CC89022E7C} wäre nicht so schön...

Gibt es hierfür eine Windows-Funktion die ich benutzen könnte oder etwas Ähnliches?

Grüße
blablab

Bummi 1. Aug 2012 05:35

AW: StringToKnownFolder gesucht
 
Delphi-Quellcode:
uses ActiveX, ShlObj;

function GetSpecialFolder(hWindow: HWND; Folder: Integer): String;
var
  pMalloc: IMalloc;
  pidl: PItemIDList;
  Path: PChar;
begin
// Parameter für Folder:
//Const CSIDL_FLAG_CREATE = &H8000   '(Win 2000) Falls das Verzeichnis nicht Eistiert wird es erstellt
//Const CSIDL_FLAG_DONT_VERIFY = &H4000   '(Win 2000) Benutzt den Ordner auch wenn der CSIDL nicht existiert
//Const CSIDL_ADMINTOOLS = &H30   '(Win 2000) Ermittelt das Verzeichnis "Administrations Tools"
//Const CSIDL_ALTSTARTUP = &H1D   'Ermittelt das Verzeichnis "Alternatives Startverzeichnis"
//Const CSIDL_APPDATA = &H1A   'Ermittelt das Verzeichnis "AppData"
//Const CSIDL_BITBUCKET = &HA   'Ermittelt das Verzeichnis "Papierkorb"
//Const CSIDL_COMMON_ADMINTOOLS = &H2F   '(Win 2000) Ermittelt das Verzeichnis "Administartions Tools für alle Benutzer"
//Const CSIDL_COMMON_ALTSTARTUP = &H1D   '(Win 2000) Ermittelt das Verzeichnis "Alternatives Startverzeichnis für alle Benutzer"
//Const CSIDL_COMMON_APPDATA = &H23   '(Win NT/2000) Ermittelt das Verzeichnis "AppData für alle Benutzer"
//Const CSIDL_COMMON_DESKTOPDIRECTORY = &H19   '(Win NT/2000) Ermittelt das Verzeichnis "Desktop für alle Benutzer"
//Const CSIDL_COMMON_DOCUMENTS = &H2E   '(Win NT/2000) Ermittelt das Verzeichnis "Dokumente für alle Benutzer"
//Const CSIDL_COMMON_FAVORITES = &H1F   '(Win NT/2000) Ermittelt das Verzeichnis "Favoriten für alle Benutzer"
//Const CSIDL_COMMON_PROGRAMS = &H17   '(Win NT/2000) Ermittelt das Verzeichnis "Startmenü/Programme für alle Benutzer"
//Const CSIDL_COMMON_STARTMENU = &H16   '(Win NT/2000) Ermittelt das Verzeichnis "Startmenü für alle Benutzer"
//Const CSIDL_COMMON_STARTUP = &H18   '(Win NT/2000) Ermittelt das Verzeichnis "Startmenü/Autostart für alle Benutzer"
//Const CSIDL_COMMON_TEMPLATES = &H2D   '(Win NT/2000) Ermittelt das Verzeichnis "Templates für alle Benutzer"
//Const CSIDL_CONTROLS = &H3   'Ermittelt das Verzeichnis "Systemsteuerung"
//Const CSIDL_COOKIES = &H21   'Ermittelt das Verzeichnis "Cookies"
//Const CSIDL_DESKTOP = &H0   'Ermittelt das Verzeichnis "Desktop"
//Const CSIDL_DESKTOPDIRECTORY = &H10   'Ermittelt das Verzeichnis "Desktop-Verzeichnis"
//Const CSIDL_DRIVES = &H11   'Ermittelt das Verzeichnis "Arbeitsplatz"
//Const CSIDL_FAVORITES = &H6   'Ermittelt das Verzeichnis "Favoriten"
//Const CSIDL_FONTS = &H14   'Ermittelt das Verzeichnis "Fonts"
//Const CSIDL_HISTORY = &H22   'Ermittelt das Verzeichnis "History"
//Const CSIDL_INTERNET = &H1   'Ermittelt das Verzeichnis "Internet"
//Const CSIDL_INTERNET_CACHE = &H20   'Ermittelt das Verzeichnis "Internet Cache"
//Const CSIDL_LOCAL_APPDATA = &H1C   '(nur IE ab Version 5.0) Ermittelt das Verzeichnis "Local AppData"
//Const CSIDL_MYPICTURES = &H27   '(nur IE ab Version 5.0) Ermittelt das Verzeichnis "Eigene Bilder"
//Const CSIDL_NETHOOD = &H13   'Ermittelt das Verzeichnis "Netzwerkumgebung"
//Const CSIDL_NETWORK = &H12   'Ermittelt das Verzeichnis "Gesamtes Netzwerk"
//Const CSIDL_PERSONAL = &H5   'Ermittelt das Verzeichnis "Eigene Dokumente"
//Const CSIDL_PRINTERS = &H4   'Ermittelt das Verzeichnis "Drucker"
//Const CSIDL_PRINTHOOD = &H1B   'Ermittelt das Verzeichnis "Drucker-Verzeichnis"
//Const CSIDL_PROFILE = &H28   '(nur IE ab Version 5.0) Ermittelt das Verzeichnis "Profile"
//Const CSIDL_PROGRAM_FILES = &H26   '(nur IE ab Version 5.0) Ermittelt das Verzeichnis "Programme"
//Const CSIDL_PROGRAM_FILES_COMMON = &H2B   '(Win NT/2000) Ermittelt das Verzeichnis "Programme für alle Benutzer"
//Const CSIDL_PROGRAM_FILES_COMMONX86 = &H2C   '(Win 2000 - x86) Ermittelt das Verzeichnis "Programme für alle Benutzer"
//Const CSIDL_PROGRAM_FILESX86 = &H2A   '(Win 2000 - RISC) Ermittelt das Verzeichnis "Programme für alle Benutzer"
//Const CSIDL_PROGRAMS = &H2   'Ermittelt das Verzeichnis "Startmenü/Programme"
//Const CSIDL_RECENT = &H8   'Ermittelt das Verzeichnis "Startmenü/Dokumente"
//Const CSIDL_SENDTO = &H9   'Ermittelt das Verzeichnis "Senden zu"
//Const CSIDL_STARTMENU = &HB   'Ermittelt das Verzeichnis "Startmenü"
//Const CSIDL_STARTUP = &H7   'Ermittelt das Verzeichnis "Autostart"
//Const CSIDL_SYSTEM = &H25   '(nur IE ab Version 5.0) Ermittelt das Verzeichnis "System"
//Const CSIDL_SYSTEMX86 = &H29   '(Win 2000) Ermittelt das Verzeichnis "Systemx86"
//Const CSIDL_TEMPLATES = &H15   'Ermittelt das Verzeichnis "Templates"

  if (SHGetMalloc(pMalloc) <> S_OK) then
  begin
    MessageBox(hWindow, 'Couldn''t get pointer to IMalloc interface.',
               'SHGetMalloc(pMalloc)', 16);
    Exit;
  end;

  SHGetSpecialFolderLocation(hWindow, Folder, pidl);
  GetMem(Path, MAX_PATH);
  SHGetPathFromIDList(pidl, Path);
  Result := Path;
  FreeMem(Path);

  pMalloc.Free(pidl);
end;

divBy0 1. Aug 2012 05:39

AW: StringToKnownFolder gesucht
 
Meins du SHGetKnownFolderPath und KNOWNFOLDERID?

blablab 3. Aug 2012 06:59

AW: StringToKnownFolder gesucht
 
Mein Problem ist eigentlich eher wie ich an die richtige CSIDL komme. ich bräuchte also noch zusätzlich zu Brummis Funktion GetSpecialFolder() die Funktion DescriptionToCSIDL():
Delphi-Quellcode:
function StringToKnownFolder(str: String);
begin
Result := GetSpecialFolder(..., DescriptionToCSIDL(str));
end;

Sir Rufo 3. Aug 2012 07:20

AW: StringToKnownFolder gesucht
 
Suchst du evtl. sowas SpecialFolders

Iwo Asnet 3. Aug 2012 12:49

AW: StringToKnownFolder gesucht
 
Zitat:

Zitat von blablab (Beitrag 1176776)
Mein Problem ist eigentlich eher wie ich an die richtige CSIDL komme. ich bräuchte also noch zusätzlich zu Brummis Funktion GetSpecialFolder() die Funktion DescriptionToCSIDL():
Delphi-Quellcode:
function StringToKnownFolder(str: String);
begin
Result := GetSpecialFolder(..., DescriptionToCSIDL(str));
end;

Dann bau sie dir doch... Du hast doch schon alles da...
Delphi-Quellcode:
Function DescriptionToCSIDL (aDescription : String) : Word;
Begin
If aDescription = 'Alternatives Startverzeichnis' then
  result := CSIDL_ALTSTARTUP;
If aDescription = 'AppData' then
  result := CSIDL_APPDATA;
...
End;
Is ne Sache von 2 Minuten.

p80286 3. Aug 2012 13:20

AW: StringToKnownFolder gesucht
 
Wenn ich Dich richtig verstanden habe willst Du so etwas wie ein Wörterbuch

"Versenden" : CSIDL_SENDTO
"noch zu senden" : CSIDL_SENDTO
"versand" : CSIDL_SENDTO

oder?

@Bummi
Kann es sein, daß in Deinem Beispiel die "eigenen Dateien" fehlen?
CSIDL_Personal übersehen.

Gruß
K-H

Bummi 3. Aug 2012 14:23

AW: StringToKnownFolder gesucht
 
@p80286

kann gut sein, ist schon älter ...

blablab 4. Aug 2012 03:23

AW: StringToKnownFolder gesucht
 
Im prinzip läuft es tatsächlich auf so ein "Wörterbuch" hinaus. Ich dachte nur eventuell gibt es da sowas ähnliches schon. Mir gehts eigentlich nur darum, nicht selbst eine unvollständige oder fehlerhafte Funktion zu schreiben, wenn es sowas schon gibt. Ich hätte gedacht, dass Windows sowas anbietet, aber scheinbar bin ich der einzige der sowas braucht :) Naja, dann schreib ich es halt selbst...

Vielen Dank für aure Antworten!

terence14 10. Jan 2013 13:19

AW: StringToKnownFolder gesucht
 
Zitat:

Zitat von blablab (Beitrag 1176848)
Im prinzip läuft es tatsächlich auf so ein "Wörterbuch" hinaus. Ich dachte nur eventuell gibt es da sowas ähnliches schon. Mir gehts eigentlich nur darum, nicht selbst eine unvollständige oder fehlerhafte Funktion zu schreiben, wenn es sowas schon gibt. Ich hätte gedacht, dass Windows sowas anbietet, aber scheinbar bin ich der einzige der sowas braucht :) Naja, dann schreib ich es halt selbst...

Vielen Dank für aure Antworten!

Vielleicht hast Du die Möglichkeit, Deine Schreibergebnisse
hier reinzustellen. Dann könn(t)en wir alle bei Der Vervollständigung
solch einer Liste helfen.

MfG,
terence


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