¿Cómo agregar un ícono a un archivo exe existente (sin un ícono por defecto)?

Cuando estaba buscando en Google encontré una clase útil que nos permitía cambiar el ícono de cualquier.exe utilizando la siguiente línea de código:

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

Where 200 y 1 son respectivamente íconoGroupID e iconoBaseID que puedo determinar usando Resource Hacker. En este caso, el icono del archivo cambia correctamente sin dañar el archivo.

Así que planeé usar esta clase en mi programa, que es un protector de SFX / Software, el archivo de salida siempre no tiene un icono, todo lo que puedo ver en el pirata informático de recursos es el siguiente:

No puedo ver la identificación del grupo de iconos ni la identificación de la base, de todos modos (no sé qué poner en lugar de 200 y 1 en este caso) Así que intenté cambiar el icono usando la misma línea de código mencionada anteriormente, Usé la siguiente línea de código (igual que el anterior):

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

El icono del archivo se cambió correctamente pero el archivo ya no funciona!

Cuando intenté volver a abrir el archivo usando ResourceHacker, encontré lo siguiente:

arece que los recursos del icono se agregaron correctamente, pero no puedo entender por qué el archivo ya no funciona, parece que está dañad

Cualquier ayuda sería apreciada

Nota: ¡Intenté usar esta clase con un archivo desprotegido y funciona de maravilla!

La clase que estoy usando es la siguiente:

// 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);
    }
}
}

¿Alguna ayuda o sugerencia para agregar el icono al archivo protegido sin corromperlo?

Respuestas a la pregunta(6)

Su respuesta a la pregunta