AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Icons aus Shell32.dll

Ein Thema von Tpercon · begonnen am 12. Jul 2002 · letzter Beitrag vom 22. Aug 2004
Antwort Antwort
Seite 1 von 3  1 23      
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#1

Icons aus Shell32.dll

  Alt 12. Jul 2002, 20:18
Wie kann ich die Laufwerksymbole aus der Shell32.dll auslesen?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 12. Jul 2002, 20:47
Moin Tpercon,

ich hab' hier mal eine etwas umfangreichere Lösung:

Code:
unit MAIN;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Menus, ImgList, ComCtrls, ExtCtrls,filectrl;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    MainMenu1: TMainMenu;
    ffnen1: TMenuItem;
    ImageList1: TImageList;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    ListView1: TListView;
    TabSheet2: TTabSheet;
    ImageList2: TImageList;
    ListView2: TListView;
    procedure ffnen1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FSaveAsIcon : Boolean;
  public
    { Public-Deklarationen }
    property SaveAsIcon : Boolean read FSaveAsIcon write FSaveAsIcon;
  end;

var
  Form1: TForm1;

type
  PHICON = ^HICON;

  TcsExtractIconEx = function(
    const lpszFile   : PChar;
    const nIconIndex : integer;
    const phiconLarge : PHICON;
    const phiconSmall : PHICON;
    const nIcons     : DWORD
    ) : DWORD; stdcall;

var
  ExtractIconEx : TcsExtractIconEx;

implementation

{$R *.DFM}

var
  hDLL : DWORD;


procedure TForm1.ffnen1Click(Sender: TObject);

var
  pLarge : PHICON;
  pSmall : PHICON;
  pWork  : PHICON;
  icoWork : TIcon;
  dwCount : DWord;
  i      : integer;

begin
  if OpenDialog1.Execute then
  begin
    Caption := '['+OpenDialog1.FileName+']';
    ImageList1.Clear;
    ImageList2.Clear;
    ImageList1.Width := GetSystemMetrics(SM_CXSMICON);
    ImageList1.Height := GetSystemMetrics(SM_CYSMICON);
    ImageList2.Width := GetSystemMetrics(SM_CXICON);
    ImageList2.Height := GetSystemMetrics(SM_CYICON);
    ListView1.Items.Clear;
    ListView2.Items.Clear;
    ListView1.Items.BeginUpdate;
    ListView2.Items.BeginUpdate;
    try
      dwCount := ExtractIconEx(PChar(OpenDialog1.FileName),-1,nil,nil,0);
      pLarge := AllocMem(dwCount*SizeOf(HICON));
      pSmall := AllocMem(dwCount*SizeOf(HICON));
      icoWork := TIcon.Create;
      try
        ExtractIconEx(PChar(OpenDialog1.FileName),0,pLarge,pSmall,dwCount);
        pWork := pSmall;
        for i := 0 to dwCount-1 do
        begin
          icoWork.Handle := pWork^;
          ImageList1.AddIcon(icoWork);
          ListView1.Items.Add;
          ListView1.Items[ListView1.Items.Count-1].ImageIndex := ImageList1.Count-1;
          ListView1.Items[ListView1.Items.Count-1].Caption := IntToStr(ImageList1.Count-1);
          inc(pWork);
        end;
        pWork := pLarge;
        for i := 0 to dwCount-1 do
        begin
          icoWork.Handle := pWork^;
          ImageList2.AddIcon(icoWork);
          ListView2.Items.Add;
          ListView2.Items[ListView2.Items.Count-1].ImageIndex := ImageList2.Count-1;
          ListView2.Items[ListView2.Items.Count-1].Caption := IntToStr(ImageList2.Count-1+ImageList1.Count);
          inc(pWork);
        end;
      finally
        FreeAndNil(icoWork);
        FreeMem(pLarge,dwCount*SizeOf(HICON));
        FreeMem(pSmall,dwCount*SizeOf(HICON));
      end;
    finally
      ListView1.Items.EndUpdate;
      ListView2.Items.EndUpdate;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PageControl1.ActivePage := TabSheet1;
end;

initialization
begin
  hDLL := LoadLibrary('shell32.dll');
  if hDLL = 0 then
  begin
    ShowMessage('Laden von SHELL32.DLL fehlgeschlagen');
    exit;
  end;
  @ExtractIconEx := GetProcAddress(hDLL,'ExtractIconEx');
  if @ExtractIconEx = nil then
  begin
    ShowMessage('ExtractIconEx');
    exit;
  end;
end;

finalization
begin
  if hDLL <> 0 then
  begin
    FreeLibrary(hDLL);
  end;
end;
end.
Welche Kompos Du brauchst ergibt sich wohl aus der Deklaration von TForm1.
Delphi hat zwar eine Implementation von ExtractIconEx, die ist aber leider Fehlerhaft, so dass ein eigener Import notwendig wird.
Mit diesem Code bekommst Du alle Icon's im OpenDialog (Filter auf EXE und DLL) angegebenen Datei angezeigt.
Die ListViews müssen auf ViewStyle vsICON eingestellt sein.

Das ist nur ein Fragment
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
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 12. Jul 2002, 20:51
Auf Delphi 3000 habe ich einen Artikel geschrieben, der einen Weg zeigt das Icon jeder Datei/jedes Ordners zu ermitteln. Für die Laufwerke musst Du einfach den Laufwerkspfad C:\ übergeben.

http://www.delphi3000.com/articles/article_3293.asp

Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#4
  Alt 13. Jul 2002, 09:53
@ Christian:
Leider muß ich gezielt bestimmte Icons haben und jetzt weiß ich ja nicht, ob die Icons in jeder Shell32.dll genau an der gleichen Stelle sind?!

@ sakura:
Willst du nicht mal ein paar deiner Einträge auf Delphi 3000 nach hier übertrgen?

Gruß
  Mit Zitat antworten Zitat
Daniel B
(Gast)

n/a Beiträge
 
#5
  Alt 13. Jul 2002, 10:37
Zitat von Tpercon:
Leider muß ich gezielt bestimmte Icons haben und jetzt weiß ich ja nicht, ob die Icons in jeder Shell32.dll genau an der gleichen Stelle sind?!
Hi,

bei 95, 98 und ME sind sie an der gleichen Stelle.
Ich denke das es bei NT, 2k auch noch so sein wird, aber bei XP? Ich weiss nicht, dem trau ich alles zu.
Man sollte aber auch leute mit XP nicht fördern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 13. Jul 2002, 11:49
Moin Tpercon,

also ich würde mal mit hoher Wahrscheinlichkeit davon ausgehen, dass die Icons, unabhängig vom OS, immer an der gleichen Stelle liegen.
Bei XP könntest Du, da es hier ja auch noch die 48x48 und 64x64 gibt, wohl noch mehr finden.
Wie das genau aussieht kann ich allerdings, mangels XP, nicht ausprobieren.
Würde sich an den Positionen etwas ändern, hätte, unter Umständen wohl auch so manches Microsoft Produkt ein Problem.
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
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#7
  Alt 13. Jul 2002, 11:58
Meinst du denn z.B. das Laufwerksymbol ist immer an der 8ten Stelle und so?
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#8
  Alt 13. Jul 2002, 12:49
Moin Tpercon,

würde ich mal von ausgehen.
Was eventuell möglich wäre (ich kenne jetzt die Einstellmöglichkeiten von XP noch nicht):
Da es unter XP ja auch noch weitere Grössen für die Icons gibt, könnte es sein, dass man sich jeweils die Anzahl der Icons der verschiedenen Grössen "merken" muss, und das gewünschte Icon hat dann den entprechenen Offset. Soll heissen:

Es gibt vor den 16x16 Icons keine weiteren: Hier sollte die Nummer sich nicht ändern.
Bei den 32x32 Icons wäre es dann: Anzahl 16x16 Icons plus der gewünschten Nummer.

Beispiel:
Unter W2K SP 1 gibt es 108 Small Icons (16x16, Nummer 0 - 107).
Das Laufwerksicon ist das 9. Icon und hat somit die Nummer 8.
Soll das entsprechende Large Icon angesprochen werden, muss die Anzahl der Small Icons dazugezählt werden, also 108 + 8 = 116.

Mit dieser Methode spielt es dann wohl auch keine Rolle, ob sich die Anzahl der Icons vergrössert, denn dass es ein bestimmtes Icon nur in einer Grösse gibt erscheint mir für die Shell32 äusserst unwahrscheinlich.

Wie's jetzt unter XP aussieht kann ich leider nicht genau sagen, aber da die Funktion ExtractIconEx nur zwei Tabellen kennt, vermute ich mal, dass hier der Unterschied nur in der Grösse von Small und Large besteht, dass also, nur als Beispiel, 32x32 als Small und 64x64 als Large angesehen werden. Das wäre dann durch GetSystemMetrics zu ermitteln, dürfte sich aber auf die Nummerierung nicht auswirken.
Da es auch in den Headern keine Konstanten zu geben scheint, die weitere Icongrössen zulassen (so nach dem Motto Extra Large oder ähnlich) reichen die zwei Tabellen die ExtractIconEx zur Verfügung stellt dann auch. Nur wie gross nun Small bzw. Large ist hängt von den Systemeinstellungen ab.
Du wirst Dich also wohl darauf verlassen können, dass Icon #8 immer das kleine Laufwerksicon ist, aber dieses muss nicht zwingend 16x16 gross sein.
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
MathiasSimmack
(Gast)

n/a Beiträge
 
#9
  Alt 13. Jul 2002, 13:23
Zitat von Christian Seehase:
würde ich mal von ausgehen.
Ich hatte mal eine Gegenüberstellung, weil ich damals webmaker vorschlagen wollte, in sein TNA-Programm die Icons aus der "shell32.dll" zu integrieren, anstelle seine Ressourcen mit den entsprechenden Bitmaps vollzuhauen - und das Programm so noch größer zu machen.

Es gab aber Unterschiede in den Positionen. Mal schau´n. Vielleicht habe ich die Liste noch ... Ansonsten muss ich noch mal die "shell32.dll" von XP auf die FAT32-Partition von 98 rüberziehen und den Inhalt mit MicroAngelo vergleichen.

Also, in den meisten Fällen stimmen die Positionen überein ... aber davon ausgehen würde ich nicht.
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#10
  Alt 13. Jul 2002, 13:36
Wäre nett wenn du mal nach schauen würdest, denn wenn es größere Unterschiede gibt, dann brauch ich garnicht damit anzufangen sondern laß die Icons schon in der Anwendung.

Gruß
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 05: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