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