用于从.exe中提取图标的简单代码

时间:2009-08-28 22:47:53

标签: icons extract

任何人都可以展示简短的代码段吗?它应该以.exe的名称作为输入并输出.ico文件。越短越好,请不要推荐任何二进制文件。这似乎是一个如此简单的任务,但我发现的唯一代码看起来非常臃肿。谢谢!

2 个答案:

答案 0 :(得分:4)

虽然听起来很简单,但在实践中像Win32中的大多数内容一样,这并非易事。特别是代码库的这一大块感觉真的很老了......操纵它是一种皇家的痛苦。加剧这一点的原因是每个文件有多个图标大小,每个文件每个大小有多个图标。

这里有一些旧代码可以完成你需要的很多东西(但不是全部)。通过破解EXE并让你自己获得图标,这可以帮助你顺利完成任务:

一些设置:

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

简而言之,此代码打开目标文件,计算其中的图标数量,然后获取有关每个ICONINFO的每个实例的信息。这是我认为你关心的结构,因为它包含位图本身。

从ICONINFO转到新的.ico文件不是我们需要做的,所以我无法帮助解决这个问题......但它有多难? ; - )

祝你好运!

答案 1 :(得分: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