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
Aber das Trim ist total überflüssig und kostet wertvolle Lebenszeit

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().

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().

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

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

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

Dann hättest du gleich
Code: Alles auswählen
If SHGetSpecialFolderLocation_ (0, CSIDL, @*itemid) = 0
schreiben können.
