2009-08-28 5 views
1

誰かが簡単で簡単なコードスニペットを表示できますか?入力として.exeという名前をとり、.icoファイルを出力する必要があります。短い方が良いですし、バイナリはお勧めしません。このような単純な作業のようですが、私が見つけた唯一のコードは非常に肥大しているようです。ありがとう!.exeからアイコンを抽出する簡単なコード

+4

言語/技術: – Noldorin

+0

すべての言語。うまくいくものを探しています。 :) – Lin

答えて

4

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

ここでは、必要なものがたくさんありますが(すべてではない)、古いコードがあります。

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

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 
    } 
} 

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

ICONINFOから新しい.icoファイルへの移行は、私たちが必要としていたものではなかったため、その部分を手助けすることはできません...しかし、どれくらい難しいでしょうか? ;-)

幸運!

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 
+0

...そして誰かが不思議に思うように:はい、もちろん、私は10年前に書かれたコードを見ることに伴う恥ずかしさを感じます!うまくいけば、たとえそれがすべてlpszされたとしてもまだ役に立ちます.-) – DarkSquid

+0

+1これは分かりませんでした(複雑なコードに比べて)。これは私にとって素晴らしいスタートです、ありがとう! – Lin

0

私はこれを見つけましたか?
関連する問題