Como adicionar um ícone a um arquivo exe existente (sem um ícone por padrão

Quando estava pesquisando no Google, encontrei uma classe útil que permite alterar o ícone de qualquer.exe usando a seguinte linha de código:

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

Onde 200 e 1 são respectivamente iconGroupID e íconeBaseID, que posso determinar usando o Resource Hacker. Nesse caso, o ícone do arquivo muda com êxito sem danificá-l

ntão planejei usar essa classe no meu programa, que é um protetor SFX / Software, o arquivo de saída sempre não tem um ícone, tudo o que posso ver no Resource hacker é o seguint

Não consigo ver o ID do grupo de ícones nem o ID de base (de qualquer forma, não sei o que colocar em vez de 200 e 1). Tentei alterar o ícone usando a mesma linha de código mencionada acima, Eu usei a seguinte linha de código (o mesmo que acima):

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

O ícone do arquivo foi alterado com sucesso, mas o arquivo não funciona mais!

Quando tentei reabrir o arquivo usando o ResourceHacker, encontrei o seguinte:

Parece que os recursos do ícone foram adicionados com êxito, mas não consigo descobrir por que o arquivo não funciona mais, parece que ele está corrompid

Qualquer ajuda seria apreciada

ota: Tentei usar esta classe com arquivos desprotegidos e funciona como um encant

A classe que estou usando é a seguinte:

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

Alguma ajuda ou sugestão sobre como adicionar o ícone ao arquivo protegido sem danificá-l

questionAnswers(6)

yourAnswerToTheQuestion