1

誰でも短くて簡単なコード スニペットを表示できますか? 入力として .exe の名前を取り、.ico ファイルを出力する必要があります。短いほど良いので、バイナリを推奨しないでください。これは非常に単純な作業のように思えますが、私が見つけた唯一のコードは非常に肥大化しているように見えます。ありがとう!

4

2 に答える 2

4

簡単に聞こえますが、実際には Win32 のほとんどのものと同様に、簡単ではありません。特に、このコードベースの全体のチャンクは本当に、本当に古く感じます...そして、それを操作するのは王様の苦痛です. これを悪化させるのは、ファイルごとに複数のアイコン サイズがあり、ファイルごとにサイズごとに複数のアイコンがあるという事実です。

これは、必要なことの多くを実行する古いコードです (ただし、すべてではありません)。これにより、EXE をクラックしてアイコン自体を取得することで、うまくいくはずです。

いくつかのセットアップ:

static const int _MAX_ICONS = 2;

typedef struct INTERNAL_ICON_INFO
{
    HICON hIcon;
    int nSize;
}  INTERNAL_ICON_INFO;


typedef struct TAG_ICON_BUNDLE_DETAILS
{
    int nLargeIcons;
    INTERNAL_ICON_INFO aiiLargeIcons[_MAX_ICONS];

    int nSmallIcons;
    INTERNAL_ICON_INFO aiiSmallIcons[_MAX_ICONS];
} ICON_BUNDLE_DETAILS;

アイコン抽出コード:

HINSTANCE hTargetModule  = LoadLibrary((LPCTSTR)stTargetFile); 
if (NULL != hTargetModule)
{
    int nIconCount = ExtractIconEx((LPCTSTR)stTargetFile, -1, NULL, NULL, 0);   // get total icon count
    ICON_BUNDLE_DETAILS* priiArray = new ICON_BUNDLE_DETAILS[nIconCount];

    int nExtracted = 0; 
    for (int i = 0; i < nIconCount; i++)
    {
        HICON* phiLargeIcons = new HICON[nIconCount];
        HICON* phiSmallIcons = new HICON[nIconCount];

        nExtracted = ExtractIconEx((LPCTSTR)stTargetFile, i, phiLargeIcons, phiSmallIcons, _MAX_ICONS);

        for (int j = 0; j < nExtracted; j++)
        {
            ICONINFO ii;
            GetIconInfo(phiLargeIcons[j], &ii);

            priiArray[i].nLargeIcons = nExtracted;
            priiArray[i].aiiLargeIcons[j].hIcon = phiLargeIcons[j];
            priiArray[i].aiiLargeIcons[j].nSize = sizeof(ICONINFO);
        }

        for (j = 0; j < nExtracted; j++)
        {
            priiArray[i].nSmallIcons = nExtracted;
            priiArray[i].aiiSmallIcons[j].hIcon = phiSmallIcons[j];
            priiArray[i].aiiSmallIcons[j].nSize = sizeof(ICONINFO);
        }
    }

    if (nExtracted > 0)
    {
        // process extracted icons
    }
}

要するに、このコードはターゲット ファイルを開き、そこにあるアイコンの数を数え、各 ICONINFO の各インスタンスに関する情報を取得します。ビットマップ自体が含まれているため、それがあなたが気にかけていると思う構造体です。

ICONINFO から新しい .ico ファイルへの移行は、私たちが行う必要があったことではありませんでした。そのため、私はその部分を手伝うことはできません...しかし、それはどれほど難しいでしょうか? ;-)

幸運を!

于 2009-08-28T23:42:10.617 に答える
0

私はこれを見つけました:

Private Sub frmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    Me.Icon = Icon.ExtractAssociatedIcon(My.Application.Info.DirectoryPath 
              & "\" & My.Application.Info.AssemblyName & ".exe")
End Sub
于 2017-09-18T08:26:02.527 に答える