2009-08-28 11 views
1

Quelqu'un peut-il afficher un extrait de code court et simple? Il devrait prendre le nom d'un .exe comme entrée et produire un fichier .ico. Le plus court sera le mieux, et s'il vous plaît ne recommande pas de binaires. Cela semble être une tâche si simple, mais le seul code que j'ai trouvé semble extrêmement gonflé. Merci!Code simple pour extraire une icône d'un fichier .exe

+4

Langue/technologie? – Noldorin

+0

N'importe quelle langue. Je cherche juste quelque chose qui fonctionne. :) – Lin

Répondre

4

Bien que cela semble simple, comme la plupart des choses dans Win32 en pratique, ce n'est pas trivial. En particulier, tout ce bloc de code se sent vraiment, vraiment vieux ... et c'est une douleur royale de le manipuler. Cela est dû au fait qu'il existe plusieurs tailles d'icônes par fichier, ainsi que plusieurs icônes par taille et par fichier.

Voici un ancien code qui fait beaucoup de ce dont vous avez besoin (mais pas tous). Cela devrait vous bien sur votre chemin par craquage EXEs et vous obtenir les icônes elles-mêmes:

Certains configuration:

static const int _MAX_ICONS = 2; 

typedef struct INTERNAL_ICON_INFO 
{ 
    HICON hIcon; 
    int nSize; 
} INTERNAL_ICON_INFO; 


typedef struct TAG_ICON_BUNDLE_DETAILS 
{ 
    int nLargeIcons; 
    INTERNAL_ICON_INFO aiiLargeIcons[_MAX_ICONS]; 

    int nSmallIcons; 
    INTERNAL_ICON_INFO aiiSmallIcons[_MAX_ICONS]; 
} ICON_BUNDLE_DETAILS; 

Le code d'extraction d'icônes:

HINSTANCE hTargetModule = LoadLibrary((LPCTSTR)stTargetFile); 
if (NULL != hTargetModule) 
{ 
    int nIconCount = ExtractIconEx((LPCTSTR)stTargetFile, -1, NULL, NULL, 0); // get total icon count 
    ICON_BUNDLE_DETAILS* priiArray = new ICON_BUNDLE_DETAILS[nIconCount]; 

    int nExtracted = 0; 
    for (int i = 0; i < nIconCount; i++) 
    { 
     HICON* phiLargeIcons = new HICON[nIconCount]; 
     HICON* phiSmallIcons = new HICON[nIconCount]; 

     nExtracted = ExtractIconEx((LPCTSTR)stTargetFile, i, phiLargeIcons, phiSmallIcons, _MAX_ICONS); 

     for (int j = 0; j < nExtracted; j++) 
     { 
      ICONINFO ii; 
      GetIconInfo(phiLargeIcons[j], &ii); 

      priiArray[i].nLargeIcons = nExtracted; 
      priiArray[i].aiiLargeIcons[j].hIcon = phiLargeIcons[j]; 
      priiArray[i].aiiLargeIcons[j].nSize = sizeof(ICONINFO); 
     } 

     for (j = 0; j < nExtracted; j++) 
     { 
      priiArray[i].nSmallIcons = nExtracted; 
      priiArray[i].aiiSmallIcons[j].hIcon = phiSmallIcons[j]; 
      priiArray[i].aiiSmallIcons[j].nSize = sizeof(ICONINFO); 
     } 
    } 

    if (nExtracted > 0) 
    { 
     // process extracted icons 
    } 
} 

En bref, ce code ouvre un fichier cible, compte le nombre d'icônes qu'il contient, puis saisit des informations concernant chaque instance de chaque ICONINFO. C'est la structure qui vous intéresse, car elle contient les bitmaps elles-mêmes. Passer d'ICONINFO au nouveau fichier .ico n'était pas ce que nous devions faire, donc je ne peux pas m'empêcher de faire ça ... mais est-ce que ça pourrait être difficile? ;-)

Bonne chance!

+0

... et au cas où quelqu'un se poserait des questions: Oui, bien sûr, je ressens l'embarras qui accompagne le code écrit il y a 10 ans! Heureusement, c'est encore utile, même si tout est lpsz'd up ;-) – DarkSquid

+0

+1 Je ne savais pas que ça devait être compliqué (comparé à quelques lignes de code). C'est un bon début pour moi, merci! – Lin

0

Je trouve ceci:

Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles Me.Load 
    Me.Icon = Icon.ExtractAssociatedIcon(My.Application.Info.DirectoryPath 
       & "\" & My.Application.Info.AssemblyName & ".exe") 
End Sub 
Questions connexes