GetDesktopPath()

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

GetDesktopPath()

Beitrag von hardfalcon »

Hier ist der Code, basiert auf GPIs Code vom System-Include von jaPBe:

Code: Alles auswählen

;Many thx to ts-soft for debugging!

Procedure.s GetDesktopPath()
  DesktopPath$ = Space (#MAX_PATH+1)
  If 0 = SHGetSpecialFolderLocation_(0,0, @*folderid)
    If 1 = SHGetPathFromIDList_(*folderid, @DesktopPath$)
      If Right(DesktopPath$,1) <> "\"
        DesktopPath$ + "\"
      EndIf
    EndIf
  EndIf
  ProcedureReturn DesktopPath$
EndProcedure

Debug GetDesktopPath()
//EDIT: Verbessert: Wenn DesktopPath$ nicht kein "\" als letztes Zeichen hat, wird ein "\" angefügt.

//EDIT2: Wieder verbessert, siehe andere Postings
Zuletzt geändert von hardfalcon am 26.04.2005 15:29, insgesamt 4-mal geändert.
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 »

@hardfalcon
Du solltest den Code vielleicht mal vorher testen :)

Code: Alles auswählen

Procedure.s GetDesktopPath()
  DesktopPath$ = Space (#MAX_PATH+1)
  If SHGetSpecialFolderLocation_ (0,0, @folderid) = #NOERROR
    If SHGetPathFromIDList_ (folderid, @DesktopPath$) = #False
      ProcedureReturn ""
    EndIf
  Else
   ProcedureReturn ""
  EndIf
  If Right(DesktopPath$,1) <> "\" : DesktopPath$ + "\" : EndIf
  CoTaskMemFree_(folderid) 
  ProcedureReturn DesktopPath$
EndProcedure
Debug GetDesktopPath()
Gruß
Thomas
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
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Welche Vorteile hat denn dein Code, ts-soft? Ich habe die Proc bei mir auch getestet, da ging sie einwandfrei. (Windows XP Professional 32bit)
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 »

hardfalcon hat geschrieben:Welche Vorteile hat denn dein Code, ts-soft? Ich habe die Proc bei mir auch getestet, da ging sie einwandfrei. (Windows XP Professional 32bit)
Erstens ist die Procedure nicht so deklariert, das sie einen String zurückliefern kann
Zweitens funktioniert sie bei mir garnicht. Es wurde ein Problem festgestellt
Drittens fehlen sämtliche erforderlichen Überprüfungen
Viertens fehlt die bei GPI's Include enthaltene deklarierte Strukture, dann würde es ja vielleicht gehen:

Code: Alles auswählen

Structure EMID
  cb.b
  abID.b[1]
EndStructure
Structure ITEMIDLIST
  mkid.EMID
EndStructure
Sowas gehört so hier nicht rein

Gruß
Thomas
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
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Die einzige Ursache dafür, dass sie nicht funktioniert, wäre IMHO eine Userlib, die einen Befehl namens "GetDesktopPath()" bereitstellt. Und weshalb sollte meine Procso deklariert sein, dass sie keinen String zurückliefern KANN?! Bei mir geht es, und hier ist nochmal mein Code:

[c]
Procedure GetDesktopPath()
DesktopPath$ = Space (#MAX_PATH+1)
SHGetSpecialFolderLocation_ (0,0, @*folderid)
SHGetPathFromIDList_ (*folderid, @DesktopPath$)
If "\" <> Right(DesktopPath$,1)
DesktopPath$ + "\"
EndIf
ProcedureReturn DesktopPath$

EndProcedure
[/c]

Und die Überprüfungen habe ich weggelassen, weil sie hier IMHO einfach keinen Sinn haben. Wenn du mir aber Sinn/Zweck/Funktion dieser Überprüfungen erklärst, werde ich sie natürlich sofort (wieder) einbauen.

//EDIT: "Schreien" entfernt (->nächster Post)
Zuletzt geändert von hardfalcon am 26.04.2005 15:19, insgesamt 1-mal geändert.
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 »

(Bemerkung entfernt)
Eine Procedure so deklariert liefert immer einen Long
Eine Procedure.s oder Procedure$ liefert einen String

Deine Procedure liefert also nur eine Long
Zuletzt geändert von ts-soft am 26.04.2005 15:30, insgesamt 1-mal geändert.
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
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

Achso, entschuldigung, da hab ich mich wohlmal wieder geirrt und bin ins Fettnäpfchen getreten... :oops: :oops: :oops:
Werde das ganze sofort korrigieren... Aber das mit den Überprüfungen versteh ich nach wie vor nicht...
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 »

Code: Alles auswählen

Procedure.s GetDesktopPath()
DesktopPath$ = Space (#MAX_PATH+1)
SHGetSpecialFolderLocation_ (0,0, @*folderid)
SHGetPathFromIDList_ (*folderid, @DesktopPath$)
; If "\" <> Right(DesktopPath$,1)
; DesktopPath$ + "\"
; EndIf
If Right(DesktopPath$,1) <> "\"
DesktopPath$ + "\"
EndIf
ProcedureReturn DesktopPath$
EndProcedure
Debug GetDesktopPath()
So funktioniert Deine Procedure schon mal

Nachtrag:
>> Aber das mit den Überprüfungen versteh ich nach wie vor nicht...
Man sollte immer alle Ergebnisse von Funktionen überprüfen, wenn man die Möglichkeit dazu hat, um Fehler zu vermeiden.
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
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag von hardfalcon »

OK, danke! Werde ich also auch noch verbessern.
Antworten