[英]How to add an icon to an existing exe file (without an icon by default)?
當我在Google上搜索時,我發現了一個有用的類,它允許我們使用以下代碼行更改任何.exe
文件的圖標:
WindowsFormsApplication1.IconInjector.InjectIcon("myfile.exe", "myicon.ico", 200, 1);
其中200和1分別是圖標GroupID
和圖標BaseID
,我可以使用Resource Hacker確定。 在這種情況下,文件的圖標會成功更改而不會破壞文件。
所以我打算在我的程序上使用這個類,這是一個SFX /軟件保護程序,輸出文件總是沒有圖標,我在資源黑客上看到的所有內容如下:
無論如何,我無法看到圖標組ID或基本ID(在這種情況下,我不知道要放什么而不是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);
}
}
}
有關將圖標添加到受保護文件而不破壞它的任何幫助或建議?
聽起來好像保護應用程序正在驗證文件的內容是否未被篡改。 注入圖標絕對是一種篡改形式,除非更新保護軟件以忽略它,否則它將始終失敗。 或者,如果您擁有保護軟件,則可以將其更新為不剝離圖標。
我剛剛遇到了與7zip Self-Extractor exe相同的問題。
在創建Self-Extractor exe之前更新7zS.sfx(而不是exe)的圖標可以解決問題並且exe不會被破壞。
可以使用Resource Hacker之類的工具將應用程序的圖標添加到此可執行文件中。 並訪問http://georezo.net/jparis/MI_Enviro/Icons/adding_w_RH.htm
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.