AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi SHGetFileInfo und Dateien in der Path-Umgebungsvariable
Thema durchsuchen
Ansicht
Themen-Optionen

SHGetFileInfo und Dateien in der Path-Umgebungsvariable

Ein Thema von ringli · begonnen am 6. Jan 2005 · letzter Beitrag vom 7. Jan 2005
Antwort Antwort
Seite 1 von 2  1 2      
ringli

Registriert seit: 7. Okt 2004
509 Beiträge
 
Delphi 11 Alexandria
 
#1

SHGetFileInfo und Dateien in der Path-Umgebungsvariable

  Alt 6. Jan 2005, 19:54
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?

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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable

  Alt 6. Jan 2005, 19:57
Das wirst du wohl selber machen müssen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
509 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable

  Alt 6. Jan 2005, 20:15
Wenn ich wüsste wie das geht, würde ich nicht fragen. Den anderen Code habe ich ja auch hier aus dem Forum...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable

  Alt 6. Jan 2005, 20:53
FinfFirstFinfFirst wirst du wohl brauchen und damit durchsuchst du die in der Umgebungsvaraiblen Path angegebenen Verzeichnisse.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable

  Alt 6. Jan 2005, 22:20
Ä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 ... 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.
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
509 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable

  Alt 7. Jan 2005, 13:01
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 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.

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

[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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable

  Alt 7. Jan 2005, 13:52
Moin Ringli,

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?
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
509 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable

  Alt 7. Jan 2005, 14:25
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?

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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: SHGetFileInfo und Dateien in der Path-Umgebungsvariable

  Alt 7. Jan 2005, 14:32
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);
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
7. Jan 2005, 14:32
Dieses Thema wurde von "Christian Seehase" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Kein allgemeines Problem
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr.
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