Programmaufruf über Stringgadget

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

Re: Programmaufruf über Stringgadget

Beitrag von c4s »

@ts-soft
Ist es so nicht korrekter?

Code: Alles auswählen

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

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

  ProcedureReturn Trim(location)
EndProcedure
CoTaskMemFree_() wird somit auch aufgerufen, wenn SHGetPathFromIDList_() fehlgeschlagen hat.
"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
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

Re: Programmaufruf über Stringgadget

Beitrag von ts-soft »

@c4s
Korintenkacker :mrgreen:
Aber das Trim ist total überflüssig und kostet wertvolle Lebenszeit :lol:
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
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Programmaufruf über Stringgadget

Beitrag von c4s »

Wenn SHGetSpecialFolderLocation_() nicht funktionieren sollte, gibt die Procedure 260 Leerzeichen aus, daher Trim(). :wink:
"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
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

Re: Programmaufruf über Stringgadget

Beitrag von ts-soft »

c4s hat geschrieben:Wenn SHGetSpecialFolderLocation_() nicht funktionieren sollte, gibt die Procedure 260 Leerzeichen aus, daher Trim(). :wink:
Da die Wahrscheinlichkeit des Fehlschlags weit unter ein Promille liegt, wäre ein Trim,
der laufend unnötig ausgeführt wird, aber trotzdem unnötig, wenn man es so macht:

Code: Alles auswählen

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

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

  ProcedureReturn location
EndProcedure
: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
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Programmaufruf über Stringgadget

Beitrag von c4s »

Aber was passiert, wenn SHGetSpecialFolderLocation_() fehlschlägt? Dann lieber wie folgt. Und außerdem habe ich festgestellt, dass #S_OK zurückgegeben wird:

Code: Alles auswählen

Procedure.s GetSpecialFolder(CSIDL)
	Protected *itemid.ITEMIDLIST
	Protected location.s

	If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = #S_OK
		location = Space(#MAX_PATH)
		If SHGetPathFromIDList_(*itemid, @location) = #True
			If Right(location, 1) <> "\" : location + "\" : EndIf
		Else
			location = ""
		EndIf
		CoTaskMemFree_(*itemid)
	EndIf

	ProcedureReturn location
EndProcedure
<)
"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
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

Re: Programmaufruf über Stringgadget

Beitrag von ts-soft »

Dir ist klar, das #S_OK und #NOERROR beide null sind :mrgreen:
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
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Programmaufruf über Stringgadget

Beitrag von c4s »

ts-soft hat geschrieben:Dir ist klar, das #S_OK und #NOERROR beide null sind :mrgreen:
Dann hättest du gleich

Code: Alles auswählen

If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = 0
schreiben können. :wink:
"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
Antworten