如何将图标添加到现有的exe文件(默认情况下没有图标)?

时间:2012-03-21 18:58:37

标签: c# .net

当我在Google上搜索时,我发现了一个有用的类,它允许我们使用以下代码行更改任何.exe文件的图标:

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

其中200和1分别是图标GroupID和图标BaseID,我可以使用Resource Hacker确定。在这种情况下,文件的图标会成功更改而不会破坏文件。

所以我打算在我的程序上使用这个类,这是一个SFX /软件保护程序,输出文件总是没有图标,我在资源黑客上看到的所有内容如下:

Resource Hacker view of PuTTY_Protected.exe prechange

我无法看到图标组ID或基本ID,不管怎么说(在这种情况下,我不知道要放什么而不是200和1)所以我尝试使用提到的相同代码行更改图标上面,我使用了以下代码行(与上面相同):

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

文件图标已成功更改,但该文件不再有效!

当我尝试使用ResourceHacker重新打开文件时,我找到了以下内容:

Resource Hacker view of PuTTY_Protected.exe after change

似乎图标资源已成功添加,但我无法弄清楚为什么该文件不再起作用,似乎已损坏。

PuTTY_protected.exe has stopped working

任何帮助都将不胜感激。

注意:我尝试将此类与不受保护的文件一起使用,它就像一个魅力!

我正在使用的课程如下:

// 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 个答案:

答案 0 :(得分:1)

听起来保护应用程序正在验证文件的内容是否未被篡改。注入图标绝对是一种篡改形式,除非更新保护软件以忽略它,否则它将始终失败。或者,如果您拥有保护软件,则可以将其更新为不剥离图标。

答案 1 :(得分:0)

我刚刚遇到了与7zip Self-Extractor exe相同的问题。

在创建Self-Extractor exe之前更新7zS.sfx(而不是exe)的图标可以解决问题,并且exe不会被破坏。

答案 2 :(得分:-1)

可以使用Resource Hacker.等工具将您的应用程序图标添加到此可执行文件中  并访问http://georezo.net/jparis/MI_Enviro/Icons/adding_w_RH.htm