zwei "Special-Folder"-Fragen

Anfängerfragen zum Programmieren mit PureBasic.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

zwei "Special-Folder"-Fragen

Beitrag von c4s »

Ich hatte soeben festgestellt, dass eine User-Lib Probleme bei mir macht,
daher bin ich nun dabei es selber zu lösen.

Ist ja nichts großes mit dem Special-Folder heraussfinden...
Aber ich bin nun auf zwei Methoden gestoßen diese herauszufinden:
> 'SHGetSpecialFolderPathA' laden
oder
> 'SHGetSpecialFolderLocation_()' und SHGetPathFromIDList_()
Ich frage mich nun welche davon sicherer ist bzw "kugelsicher" (wie es so oft
in der Hilfe genannt wird ;)) ist?

Die zweite Frage bezieht sich nun direkt auf den Desktop-Pfad.
Dafür gibt es die Konstanten #CSIDL_DESKTOP und
#CSIDL_DESKTOPDIRECTORY.
Könnt ihr mir den Unterschied sagen bzw welche mir nun immer einen
richtigen Datei-Pfad (sodass wenn ich Dateien dorthin kopiere, diese auf
dem Desktop gezeigt werden) liefert!?


Danke, c4s
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

Code: Alles auswählen

Procedure.s spec_folder(clsi_const.l)
   path.s = Space(2048)
   SHGetSpecialFolderLocation_(0,clsi_const,@pidl.l)
   SHGetPathFromIDList_(pidl,@path)
   CoTaskMemFree_(pidl)
   ProcedureReturn path+"\"
EndProcedure

Debug spec_folder(#CSIDL_DESKTOPDIRECTORY)
Ich hatte mit diesem Code keine Probleme, kann aber nicht sagen, ob es kugelsicher ist.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

RSBasic hat geschrieben: Ich hatte mit diesem Code keine Probleme, kann aber nicht sagen, ob es kugelsicher ist.
Ist schon okay, aber es ist immer besser für Pointer auch Pointer zu
verwenden, sowie alle Variablen zu deklarieren :wink:

Code: Alles auswählen

Procedure.s GetSpecialFolder(CSIDL.l)
  Protected *itemid.ITEMIDLIST
  Protected location.s = Space(#MAX_PATH)

  If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = #NOERROR
    If SHGetPathFromIDList_(*itemid, @location)
      CoTaskMemFree_(*itemid)
      If Right(location, 1) <> "" : location + "" : EndIf
      ProcedureReturn location
    EndIf
  EndIf
EndProcedure

Debug GetSpecialFolder(#CSIDL_DESKTOPDIRECTORY) 
Vor allem wenn man sowas als Baustein zur Mehrfachverwendung speichert

PS: Die ganzen Ifs sind auch nicht unbedingt unnütz :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: zwei "Special-Folder"-Fragen

Beitrag von Kurzer »

Ich bin in der MSDN gerade auf folgende Lösung gestossen.
Ist etwas einfacher gehalten.

Code: Alles auswählen

Procedure.s GetSpecialFolder(iCSIDL.i)
  Protected sPath.s = Space(#MAX_PATH)

  If SHGetSpecialFolderPath_(#Null, @sPath, iCSIDL, 0) = #True
	  ProcedureReturn sPath
	Else
		ProcedureReturn ""
  EndIf
EndProcedure

Debug GetSpecialFolder(#CSIDL_LOCAL_APPDATA)
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
Antworten