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

标签 c# .net

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

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

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

所以我计划在我的程序上使用这个类,它是一个 SFX/Software protector,输出文件总是没有图标,我在 Resource hacker 上看到的所有内容如下:

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

如有任何帮助,我们将不胜感激。

注意:我尝试将此类与未 protected 文件一起使用,它的效果非常好!

我正在使用的类如下:

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

关于将图标添加到 protected 文件而不破坏它的任何帮助或建议?

最佳答案

听起来保护应用程序正在验证文件的内容没有被篡改。注入(inject)图标绝对是一种篡改,除非更新保护软件忽略它,否则永远失败。或者,如果您拥有保护软件,则可以更新它以不删除图标。

关于c# - 如何将图标添加到现有的 exe 文件(默认情况下没有图标)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9811076/

相关文章:

c# - Shell32.Folder.GetDetailsOf(..,..) 有哪些可用选项?

c# - 为具有抽象复杂类型的模式生成类

.net - 我想要 Spy++,但我没有 Visual Studio

.net - 控制面板自定义设置中的小数点分隔符

c# 排序中的委托(delegate)是什么

c# - 非线性系统 - 如何跟踪委托(delegate)的未知数?

c# - 如何拥有照片查看器风格的页面?

c# - 每当我可以很好地练习时是否使用静态类?

c# - 避免将属性映射到表

c# - 现有连接被 WCF 中的远程主机强行关闭