Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi SHGetFileInfo und Dateien in der Path-Umgebungsvariable (https://www.delphipraxis.net/37517-shgetfileinfo-und-dateien-der-path-umgebungsvariable.html)

ringli 6. Jan 2005 18:54


SHGetFileInfo und Dateien in der Path-Umgebungsvariable
 
Ich verwende folgenden Code um das Icon von Dateien zu ermitteln. Wenn ich den kompletten Pfad zur Anwendung kenne ist es ja auch kein Problem, auch wenn ich bspw. nur '.zip' angebe wird mir das Icon korrekt angezeigt.
Will ich jetzt aber das Icon einer Datei (z.B. taskmgr.exe) ermitteln, schlägt das fehl und ich bekomme nur das Standardicon für Anwendungen angezeigt. Meine Frage ist nun wie ich SHGetFileInfo dazu überreden kann auch die Path-Umgebungsvariable zu durchsuchen/verwenden? :gruebel:

Delphi-Quellcode:
function GetIconFromFile(const szFilename: string;
  fSmall: boolean = false): TIcon;
const
  dwIconFlags : array[boolean]of dword =
    (SHGFI_LARGEICON,SHGFI_SMALLICON);
var
  fi : TSHFileInfo;
begin
  Result := nil;

  ZeroMemory(@fi,sizeof(fi));

  SHGetFileInfo(pchar(szFilename),FILE_ATTRIBUTE_NORMAL, fi, sizeof(fi),
    SHGFI_ICON or SHGFI_USEFILEATTRIBUTES or dwIconFlags[fSmall]);

  if(fi.hIcon <> 0) then
  begin
    Result := TIcon.Create;
    if(Result <> nil) then
      Result.Handle := fi.hIcon;
  end;
end;

Luckie 6. Jan 2005 18:57

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
 
Das wirst du wohl selber machen müssen.

ringli 6. Jan 2005 19:15

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
 
Wenn ich wüsste wie das geht, würde ich nicht fragen. Den anderen Code habe ich ja auch hier aus dem Forum... :oops:

Luckie 6. Jan 2005 19:53

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
 
FinfFirstFinfFirst wirst du wohl brauchen und damit durchsuchst du die in der Umgebungsvaraiblen Path angegebenen Verzeichnisse.

MathiasSimmack 6. Jan 2005 21:20

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
 
Ähem, wenn er weiß, dass das Programm im Pfad ist, dann kann er auch eine Funktion von Borland zweckentfremden. Jetzt müsste mir nur der Name einfallen ... :oops: Der übergibt man die Pfadvariablen und den Dateinamen, und die Funktion macht nichts weiter als jeweils einen Pfad nach dem anderen vor den Dateinamen zu setzen und via "fileexists" nach der Datei zu suchen.


Weiß irgendwer gerade den Namen? :( Hm, das soll mich doch ...

Edit: Delphi-Referenz durchsuchenFileSearch. Mensch, das war ´ne Geburt. :)

ringli 7. Jan 2005 12:01

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
 
Danke für den Tip Mathias!

Hier nun die überarbeitete Funktion:
Delphi-Quellcode:
function GetIconFromFile(szFilename: string;
  fSmall: boolean = false): TIcon;
const
  dwIconFlags : array[boolean]of dword =
    (SHGFI_LARGEICON,SHGFI_SMALLICON);
var
  fi : TSHFileInfo;
  aPath : String;
begin
  Result := nil;
  ZeroMemory(@fi,sizeof(fi));

  szFileName := Copy(szFileName, 0, LastDelimiter('.', szFileName) + 3);

  if ExtractFilePath (szFileName) <> '' then
    begin
      aPath := szFileName;
    end
  else
    begin
      aPath := FileSearch(szFileName, GetEnvironmentVariable('Path'));
      if ExtractFilePath (aPath) = '' then
        aPath := szFileName ;
    end;

  SHGetFileInfo(pchar(aPath),FILE_ATTRIBUTE_NORMAL, fi, sizeof(fi),
    SHGFI_ICON or SHGFI_USEFILEATTRIBUTES or dwIconFlags[fSmall]);

  if(fi.hIcon <> 0) then
    begin
      Result := TIcon.Create;
      if(Result <> nil) then
        Result.Handle := fi.hIcon;
    end;
end;
Die Funktion verschluckt sich noch bei Pfaden die Punkte enthalten. Wird die Zeile
Delphi-Quellcode:
szFileName := Copy(szFileName, 0, Pos('.', szFileName) + 3);
weggelassen funktioniert das zwar auch, allerdings gibt es dann Probleme wenn der Pfad noch irgendwelche Parameter (z.B. notepad.exe c:\temp\irgendwas.txt) enthält. :pale:

Wenn jemand dafür noch eine Lösung hätte wäre ich dankbar dafür. :-D

[EDIT]Achso, ParamStr / ParamCount funktionieren hier nicht, weil der Pfad nicht über die Kommandozeile übergeben wird.

[EDIT 2]
Code:
szFileName := Copy(szFileName, 0, Pos('.', szFileName) + 3);
durch
Code:
szFileName := Copy(szFileName, 0, LastDelimiter('.', szFileName) + 3);
ersetzt.

Christian Seehase 7. Jan 2005 12:52

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
 
Moin Ringli,

Zitat:

Zitat von ringli
Die Funktion verschluckt sich noch bei Pfaden die Punkte enthalten.

deshalb sucht man nach solchen Zeichen auch nicht von links nach rechts, sondern von rechts nach links.
Schau Dir in der Hilfe mal die Funktion Delphi-Referenz durchsuchenLastDelimiter an.

Wenn die Pfade auch noch Parameter enthalten können, wird es allerdings noch schwieriger.
Woher stammen die Pfade denn?

ringli 7. Jan 2005 13:25

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
 
Zitat:

Woher stammen die Pfade denn?
Ich habe mir vor ein paar Wochen ein ähnliches Tool zusammengestrickt wie Luckie mit seinem "RunAsUser". Dort werden der Programmpfad und evtl. Parameter in einer Zeile - im Gegensatz zu Luckies Variante - übergeben und in einer INI gespeichert.
Das funktioniert auch alles sehr gut. Wenn ich bspw. "%SystemRoot%\system32\secpol.msc /s" als Befehlszeile dort eintrage, ergänzt die RunAs-Funktion beim Ausführen den Pfad so das er dann so aussieht:
Code:
"C:\Windows\system32\mmc.exe %SystemRoot%\system32\secpol.msc /s".
Jetzt wollte ich aber halt noch als optische Verbesserung in der Oberfläche vor den Einträgen in der TreeView das dazugehörige Programmicon anzeigen.
Allerdings wollte ich dazu nicht alles in meinem Programm umstricken, da ich sonst den Pfad und die Parameter trennen müsste.

Ich hoffe die Beschreibung war einigermassen verständlich? :gruebel:

Zitat:

Schau Dir in der Hilfe mal die Funktion LastDelimiter an.
Hatte ich mir auch schon angesehen, aber irgendwie bin ich damit auch nicht zum Ziel gekommen. :(

Christian Seehase 7. Jan 2005 13:32

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable
 
Moin Ringli,

wenn sichergestellt ist, dass die Parameter immer mit Blank vom Pfad getrennt sind kannst Du es doch so machen:

Delphi-Quellcode:
sPath := trim(copy(sPathInclPara,1,LastDelimiter(' ',sPathInclPara)));
sExt := ExtractFileExt(sPath);

DP-Maintenance 7. Jan 2005 13:32

DP-Maintenance
 
Dieses Thema wurde von "Christian Seehase" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Kein allgemeines Problem


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:40 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz