AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi SHGetFileInfo und 'lnk-files'

SHGetFileInfo und 'lnk-files'

Offene Frage von "Daxon"
Ein Thema von xtrnrfe · begonnen am 16. Dez 2006 · letzter Beitrag vom 6. Nov 2009
Antwort Antwort
xtrnrfe

Registriert seit: 31. Mär 2005
25 Beiträge
 
#1

SHGetFileInfo und 'lnk-files'

  Alt 16. Dez 2006, 23:31
Hallo!

Mit dieser Funktion hole ich mir die Icons zu Dateien:

Delphi-Quellcode:
function IconFromFile(S : string): TIcon;
var
  MyIcon : TIcon;
  SHFileInfo: TSHFileInfo;
begin
  MyIcon := TIcon.Create;
  SHGetFileInfo(pchar(S), FILE_ATTRIBUTE_NORMAL, SHFileInfo, SizeOf(SHFileInfo),SHGFI_SYSICONINDEX or SHGFI_ICON or SHGFI_SMALLICON);
  MyIcon.Handle:= SHFileInfo.hIcon;
  Result:=MyIcon;
end;
Das Problem ist, dass bei Verknüpfungen immer der Pfeil links unten im Icon mit angezeigt wird ... den will ich aber weghaben ... und das reine Icon sehen.

Ich bräuchte eigentlich die Umkehr-Funktion von SHGFI_LINKOVERLAY ... hier werden für alle Dateien die Verknüpfungspfeile angezeigt.

Weiss jemand eine Lösung?

Grüsse und Danke im Vorraus!
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

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

Re: SHGetFileInfo und 'lnk-files'

  Alt 16. Dez 2006, 23:53
Bei lnk Verknüpfungen wirst Du wohl das Ziel der Verknüpfung (die Datei, auf die die Verknüpfung verweist) auslesen müssen und von dieser dann das Icon nehmen.
Wie das geht, findest Du alles über die Suche

[Nachtrag]
Da fällt mir grad ein, es geht auch einfacher:
Da das Icon der lnk ja nicht unbedingt das der Datei, auf die die Verknüpfung verweist, sein muss,
kann man auch den Pfad zum Icon und den IconIndex aus der Verknüpfung direkt auslesen.

Diese Funktion liest eine Verknüpfung komplett aus, was IconPath und IconIndex sind sollte wohl klar sein
Du kannst diese Funktion auf Deine Bedürfnisse anpassen und das was Du nicht brauchst weglassen.
Beachte: Die Funktion liefert False, falls die lnk-Datei nicht existiert oder keine gültige lnk-Datei ist.
Delphi-Quellcode:
function ReadLnkFile(const LnkFileName: String; { out Path, Arguments, WorkingDirectory, Description: String; out HotKey: Word; out ShowCmd: Integer; } out IconPath: String; out IconIndex: Integer): Boolean;
var
  Path: String; // <--- das muss dann noch dazu
  ShellLink: IShellLink;
  PersistFile: IPersistFile;
  FileInfo: TWin32FindData;
begin
  Result:=False;
  if SUCCEEDED(CoCreateInstance(CLSID_ShellLink,nil,CLSCTX_INPROC_SERVER,IShellLink,ShellLink)) then
  begin
    PersistFile:=ShellLink as IPersistFile;
    if SUCCEEDED(PersistFile.Load(StringToOleStr(LnkFileName),STGM_READ)) then
    with ShellLink do
    begin
      SetLength(Path,MAX_PATH+1);
      if SUCCEEDED(GetPath(PChar(Path),MAX_PATH,FileInfo,SLR_ANY_MATCH)) then
      begin
        Path:=PChar(Path);
        Result:=True;
      { SetLength(Arguments,MAX_PATH+1);
        GetArguments(PChar(Arguments),MAX_PATH);
        Arguments:=PChar(Arguments);
        SetLength(WorkingDirectory,MAX_PATH+1);
        GetWorkingDirectory(PChar(WorkingDirectory),MAX_PATH);
        WorkingDirectory:=PChar(WorkingDirectory);
        SetLength(Description,MAX_PATH+1);
        GetDescription(PChar(Description),MAX_PATH);
        Description:=PChar(Description);
        GetHotkey(HotKey);
        GetShowCmd(ShowCmd); }

        SetLength(IconPath,MAX_PATH+1);
        GetIconLocation(PChar(IconPath),MAX_PATH,IconIndex);
        IconPath:=PChar(IconPath);
        if IconPath='then
          IconPath:=Path;
      end
    { else
        Path:=''; }

    end;
  end;
end;
Evtl. musst Du noch diese Units einbinden, damit es funktioniert:
ShlObj, ComObj, ActiveX

//Edit:
Den Teil den Du weglassen kannst, hab ich einfach mal auskommentiert.
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
xtrnrfe

Registriert seit: 31. Mär 2005
25 Beiträge
 
#3

Re: SHGetFileInfo und 'lnk-files'

  Alt 17. Dez 2006, 00:08
Hi Martin!

Bist Du Dir da sicher?
Oh mann ... der Code ist so schön und einfach ... und soll den Pfeil nicht weglassen können?

Das Auslesen von LNK-Files ist doch kompliziert ... und dann das Exe-File mit indizierten anderen Icon oder html-file-Icon dazu suchen noch schwerer.

Geht das vielleicht doch nicht irgendwie?

Grüsse Ralf
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

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

Re: SHGetFileInfo und 'lnk-files'

  Alt 17. Dez 2006, 00:15
Hab gar nich Deinen neuen Post gesehen, also wie gesagt:
Meine Funktion oben kannst Du ja auf das Wesentliche kürzen
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
xtrnrfe

Registriert seit: 31. Mär 2005
25 Beiträge
 
#5

Re: SHGetFileInfo und 'lnk-files'

  Alt 17. Dez 2006, 00:58
Super!

Das sieht schon besser aus ... ích baus ein, und geb dann Feedback!
Danke!!!!

Grüsse Ralf
  Mit Zitat antworten Zitat
xtrnrfe

Registriert seit: 31. Mär 2005
25 Beiträge
 
#6

Re: SHGetFileInfo und 'lnk-files'

  Alt 17. Dez 2006, 14:31
Das funzt einwandfrei!

Vielen Dank! Ihr seid echt Spitze!

Grüsse Ralf
  Mit Zitat antworten Zitat
Daxon

Registriert seit: 2. Jul 2009
13 Beiträge
 
#7

Re: SHGetFileInfo und 'lnk-files'

  Alt 5. Nov 2009, 20:24
Moin,

sorry, dass ich das Thema wieder hochhole, aber ich wollte wegen der Frage keinen neuen Thread aufmachen. Es geht mir dabei um die Funktion von Martin K - nicht um den Icon-Teil, sondern um den gesamten.

Die Funktion selbst funktioniert (jedenfalls meckert der Compiler nicht), allerdings habe ich gerade irgendwie 0 Ahnung, wie ich die Funktion aufrufen kann...?

Danke im vorraus,
daXon
  Mit Zitat antworten Zitat
Benutzerbild von MarcoWarm
MarcoWarm

Registriert seit: 10. Sep 2003
Ort: Großhennersdorf
532 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8

Re: SHGetFileInfo und 'lnk-files'

  Alt 6. Nov 2009, 09:14
Hi daXon,

welchen Teil brauchst du denn?

Eine "genauere" Implementation gibts hier, da die oben stehende (oder die in der CodeLib) keine "virtuellen" Ordner versteht (z.B. Systemsteuerung etc.)

gruß
Marco
Marco Warm
TUO
TheUnknownOnes.net
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:12 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