當我在谷歌搜索,我發現它讓我們用下面的代碼行更改任何.exe
文件的圖標,一類有用:如何將圖標添加到現有的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);
}
}
}
上添加圖標受保護的文件,而不會破壞任何幫助或建議?
如果輸入文件(要保護的文件)默認沒有圖標,怎麼辦? – 2012-03-21 19:12:47
@mohamedmaache:如果將其注入到輸出可執行文件中,如果將其注入輸出可執行文件,保護系統是否會將其傳遞給輸出可執行文件?如果這樣,應該工作。 – Guvante 2012-03-21 19:15:58
好吧,我會試一試。 – 2012-03-21 19:20:40