簡體   English   中英

如何將圖標添加到現有的exe文件(默認情況下沒有圖標)?

[英]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 /軟件保護程序,輸出文件總是沒有圖標,我在資源黑客上看到的所有內容如下:

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
{

/// <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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM