Seite 2 von 2

Re: Programmaufruf über Stringgadget

Verfasst: 05.02.2011 19:46
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.

Re: Programmaufruf über Stringgadget

Verfasst: 05.02.2011 21:24
von ts-soft
@c4s
Korintenkacker :mrgreen:
Aber das Trim ist total überflüssig und kostet wertvolle Lebenszeit :lol:

Re: Programmaufruf über Stringgadget

Verfasst: 05.02.2011 23:34
von c4s
Wenn SHGetSpecialFolderLocation_() nicht funktionieren sollte, gibt die Procedure 260 Leerzeichen aus, daher Trim(). :wink:

Re: Programmaufruf über Stringgadget

Verfasst: 05.02.2011 23:42
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:

Re: Programmaufruf über Stringgadget

Verfasst: 06.02.2011 01:58
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
<)

Re: Programmaufruf über Stringgadget

Verfasst: 06.02.2011 02:49
von ts-soft
Dir ist klar, das #S_OK und #NOERROR beide null sind :mrgreen:

Re: Programmaufruf über Stringgadget

Verfasst: 06.02.2011 13:30
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: