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