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