2009-08-28 12 views
1

任何人都可以顯示簡短的代碼片段嗎?它應該以.exe的名稱作爲輸入並輸出.ico文件。越短越好,請不要推薦任何二進制文件。這似乎是這樣一個簡單的任務,但我發現的唯一代碼看起來非常臃腫。謝謝!從.exe提取圖標的簡單代碼

+4

語言/技術? – Noldorin 2009-08-28 22:49:56

+0

任何語言。只是尋找有效的東西。 :) – Lin 2009-08-29 07:56:16

回答

4

雖然聽起來很簡單,但實際上它與Win32中的大部分內容一樣,並不是微不足道的。特別是這個代碼庫的整個部分感覺真的非常老了......操縱它是一個極大的痛苦。加重這一點的是,每個文件有多個圖標大小,以及每個文件每個大小有多個圖標。

這裏有一些舊代碼,它可以完成很多你需要的東西(但不是全部)。

一些設置:

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; 

的圖標提取碼:

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 
    } 
} 

總之,這段代碼這應該由開裂EXE和讓你在圖標本身讓你對你的方式打開目標文件,統計其中有多少圖標,然後獲取有關每個ICONINFO每個實例的信息。這是我認爲你關心的結構,因爲它包含位圖本身。

從ICONINFO到新的.ico文件不是我們需要做的事情,所以我無法幫助那部分...但它有多難? ;-)

祝你好運!

+0

......如果有人想知道:是的,當然我覺得看到10年前寫的代碼會帶來尷尬!希望它仍然有用,即使它全部是lpsz'd了;-) – DarkSquid 2009-08-28 23:45:51

+0

+1不知道它 - 哈哈 - 是複雜的(與幾行代碼相比)。這對我來說是一個很好的開始,謝謝! – Lin 2009-08-29 08:00:58

0

我發現這一點:

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