2009-08-28 49 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