Einzelnen Beitrag anzeigen

Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: MyPC (SystemInfo Programm)

  Alt 23. Nov 2006, 20:21
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.
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat