Как добавить значок в существующий exe-файл (без значка по умолчанию)?

Когда я искал в Google, я нашел полезный класс, который позволяет нам менять значок любого.exe файл, используя следующую строку кода:

WindowsFormsApplication1.IconInjector.InjectIcon("myfile.exe", "myicon.ico", 200, 1);

Где 200 и 1 соответственно значокGroupID и значокBaseID который я могу определить с помощью Resource Hacker. В этом случае значок файла успешно изменяется без повреждения файла.

Поэтому я планировал использовать этот класс в своей программе, которая является протектором SFX / Software, выходной файл всегда не имеет иконки, все, что я вижу на Resource hacker, приведено ниже:

Во всяком случае, я не вижу ни идентификатора группы значков, ни базового идентификатора (в данном случае я не знаю, что поставить вместо 200 и 1). Поэтому я попытался изменить значок, используя ту же строку кода, упомянутую выше. использовал следующую строку кода (так же, как и выше):

WindowsFormsApplication1.IconInjector.InjectIcon("myfile.exe", "myicon.ico", 200, 1);

Значок файла был успешно изменен, но файл больше не работает!

Когда я попытался открыть файл с помощью ResourceHacker, я обнаружил следующее:

Кажется, что ресурсы значков были успешно добавлены, но я не могу понять, почему файл больше не работает, кажется, он поврежден.

Любая помощь будет оценена.

Примечание: я попытался использовать этот класс с незащищенным файлом, и он работает как шарм!

Класс, который я использую, является следующим:

// IconInjector.cs
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace WindowsFormsApplication1
{

/// <summary>
/// IconInjectorクラスの定義
/// </summary>
public class IconInjector
{
    [DllImport("kernel32.dll", SetLastError = true)]
    //static extern bool UpdateResource(IntPtr hUpdate, string lpType, string lpName, ushort wLanguage, IntPtr lpData, uint cbData);
    static extern int UpdateResource(IntPtr hUpdate, uint lpType, uint lpName, ushort wLanguage, byte[] lpData, uint cbData);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern IntPtr BeginUpdateResource(string pFileName,
        [MarshalAs(UnmanagedType.Bool)]bool bDeleteExistingResources);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool EndUpdateResource(IntPtr hUpdate, bool fDiscard);

    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    public static void InjectIcon(string execFileName, string iconFileName, uint iconGroupID, uint iconBaseID)
    {
        const uint RT_ICON = 3;
        const uint RT_GROUP_ICON = 14;

        // アイコンファイルの読み込み
        IconFile iconFile = new IconFile();
        iconFile.Load(iconFileName);

        // リソースの更新開始
        IntPtr hUpdate = BeginUpdateResource(execFileName, false);
        Debug.Assert(hUpdate != IntPtr.Zero);

        // RT_GROUP_ICON 書き込み
        byte[] data = iconFile.CreateIconGroupData(iconBaseID);
        UpdateResource(hUpdate, RT_GROUP_ICON, iconGroupID, 0, data, (uint)data.Length);

        // RT_ICON書き込み
        for (int i = 0; i < iconFile.GetImageCount(); i++)
        {
            byte[] image = iconFile.GetImageData(i);
            UpdateResource(hUpdate, RT_ICON, (uint)(iconBaseID + i), 0, image, (uint)image.Length);
        }

        // リソースの更新終了
        EndUpdateResource(hUpdate, false);
    }
}
}

Любая помощь или предложение по добавлению значка в защищенный файл без его повреждения?

Ответы на вопрос(3)

Ваш ответ на вопрос