Хотя это звучит просто, как и большинство вещей в 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-файлу - это не то, что нам нужно было сделать, поэтому я не могу помочь с этой частью ... но насколько это может быть сложно? ; -)
Удачи!