Простой код для извлечения иконки из .exe - PullRequest
1 голос
/ 29 августа 2009

Может кто-нибудь показать короткий и простой фрагмент кода? Он должен взять имя .exe в качестве входного и выходного файла .ico. Чем короче, тем лучше, и, пожалуйста, не рекомендуем никаких двоичных файлов. Это кажется такой простой задачей, но единственный код, который я нашел, выглядит очень раздутым. Спасибо!

Ответы [ 2 ]

4 голосов
/ 29 августа 2009

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

Удачи!

0 голосов
/ 18 сентября 2017

Я нашел это:

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