gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:04:18 25 4
gpt4 key购买 nike

当我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com