Zu Deinem Code oben, zum Auslesen der Ordnerverzeichnisse:
Ich glaube das liegt daran, dass Path als Result zurückgegeben wird und danach freigegeben wird.
Evtl. könnten dadurch Exceptions entstehen.
Hier mal, wie ich es gemacht habe:
Delphi-Quellcode:
function GetShellPath(const CSIDL: Byte): String;
var pidl: PItemIdList; Malloc: IMalloc;
begin
if (SHGetMalloc(Malloc)=S_OK) and SUCCEEDED(SHGetSpecialFolderLocation(0,CSIDL,pidl)) then
try
SetLength(Result,MAX_PATH+1);
if SHGetPathFromIDList(pidl,PChar(Result)) and (PChar(Result)<>'') then
Result:=IncludeTrailingPathDelimiter(PChar(Result))
else
Result:='';
finally
Malloc.Free(pidl);
end
else
Result:='';
end;
Dann noch einen Code hierzu:

Zitat von
Martin K:
Aber noch ein paar Vorschläge:
- unter Prozesse fehlt bei manchen der Pfad und daher auch das Icon.
Tipp: wenn nur der Dateiname da steht, z.B. calc.exe könntest Du über die EnvironmentVariable Path und mithilfe von FileExists evtl. den Pfad herausfinden.
- unter Dienste fehlen ziemlich viele Icons. Evtl. müsstest Du, um an den Pfad des Icons heran zu kommen, Parameter aus dem Pfad herausfiltern und Anführungsstriche entfernen, dazu gab es
hier mal einen ganz guten Code.
Die folgende Funktion entfernt die Parameter, die nach einer Leertaste folgen können bzw. auch die "Anführungszeichen", expandiert die %Umgebungsvariablen%, und findet eine ausführbare Datei mittels der Umgebungsvariablen Path und PathExt.
Wenn die Datei nicht gefunden wurde, wird ein leerer String zurückgegeben, ansonsten der vollständige Dateiname.
Delphi-Quellcode:
function GetExecFileName(const Command: String): String;
function ExpandEnvironmentPath(const Path: String): String;
begin
SetLength(Result,ExpandEnvironmentStrings(PChar(Path),nil,0));
ExpandEnvironmentStrings(PChar(Path),PChar(Result),Length(Result));
Result:=PChar(Result);
end;
var b: Boolean; i,j: Integer; s: String; Path, PathExt: TStrings;
begin
s:=Trim(ExpandEnvironmentPath(Command));
if (s='') or FileExists(s) then
Result:=s
else
begin
i:=1;
b:=False;
while (i<=Length(s)) and ((s[i]<>' ') or b) do
begin
if s[i]='"' then
b:=not b;
Inc(i);
end;
s:=Trim(StringReplace(Copy(s,1,i-1),'"','',[rfReplaceAll]));
if (s='') or FileExists(s) then
Result:=s
else
begin
Path:=TStringList.Create;
PathExt:=TStringList.Create;
try
Path.Delimiter:=PathSep;
Path.DelimitedText:=GetEnvironmentVariable('Path');
Path.Append(ExpandEnvironmentPath('%UserProfile%'));
Path.Append(ExpandEnvironmentPath('%SystemDrive%'));
PathExt.Delimiter:=PathSep;
PathExt.DelimitedText:=LowerCase(GetEnvironmentVariable('PathExt'));
if PathExt.Count>0 then
for i:=0 to Pred(PathExt.Count) do
if FileExists(ChangeFileExt(s,PathExt[i])) then
begin
Result:=ChangeFileExt(s,PathExt[i]);
Exit;
end;
if Path.Count>0 then
for j:=0 to Pred(Path.Count) do
begin
if FileExists(IncludeTrailingPathDelimiter(Path[j])+s) then
begin
Result:=IncludeTrailingPathDelimiter(Path[j])+s;
Exit;
end
else
if PathExt.Count>0 then
for i:=0 to Pred(PathExt.Count) do
if FileExists(ChangeFileExt(IncludeTrailingPathDelimiter(Path[j])+s,PathExt[i])) then
begin
Result:=ChangeFileExt(IncludeTrailingPathDelimiter(Path[j])+s,PathExt[i]);
Exit;
end;
end;
Result:='';
finally
Path.Free;
PathExt.Free;
end;
end;
end;
end;
Beispiel:
GetExecFileName('calc');
liefert:
C:\WINDOWS\system32\calc.exe
zurück.