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