1

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

4

2 回答 2

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 文件不是我们需要做的,所以我对那部分无能为力……但这有多难?;-)

祝你好运!

于 2009-08-28T23:42:10.617 回答
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
于 2017-09-18T08:26:02.527 回答