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

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

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

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

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

PuTTY_Protected.exe prechange的资源黑客视图

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

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

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

当我尝试使用ResourceHacker重新打开文件时,我发现如下:

更改后PuTTY_Protected.exe的资源黑客视图

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

PuTTY_protected.exe已停止工作

任何帮助,将不胜感激。

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

我正在使用的课程如下:

 // IconInjector.cs using System; using System.Runtime.InteropServices; using System.Diagnostics; namespace WindowsFormsApplication1 { ///  /// IconInjectorクラスの定義///  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); ///  /// アプリケーションのメイン エントリ ポイントです。 ///  [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); } } } 

有关将图标添加到受保护文件而不破坏它的任何帮助或建议?

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

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

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

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