2009年06月06日


dll/exe等からアイコンを画像化

VB.NET Framework2.0
VB.NET の Windows アプリケーションですが、Form を使わずに、
MyApplication_Startup を使用してバッチ処理を想定しています。

※ Partial Friend Class MyApplication の作成方法は、こちらを参照

アイコンの処理は、ExtractIconEx を使用すると、大きいアイコンと
小さいアイコンを区別できます。画像形式は他も利用可能で、Icon
クラスでそのまま保存すると、.Ico で保存されます。
( 但し FileStream が必要になります )

Imports System.Runtime.InteropServices	' DllImport 用
Imports System.Reflection	' Assembly 用

Namespace My

	Partial Friend Class MyApplication

		' 1 : インスタンス
		' 2 : ファイル
		' 3 : インデックス
		<DllImport("shell32.dll", EntryPoint:="ExtractIcon")> _
		Public Shared Function ExtractIcon( _
		  ByVal hInst As System.IntPtr, _
		  <MarshalAs(UnmanagedType.LPStr)> _
		  ByVal lpszExeFileName As String, _
		  ByVal nIconIndex As Integer _
		  ) As System.IntPtr
		End Function

		<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
		Public Shared Function DestroyIcon( _
		 ByVal handle As IntPtr) As Boolean
		End Function


		' ********************************************************
		' スタートアップ
		' ********************************************************
		Private Sub MyApplication_Startup(ByVal sender As Object, _
		ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) _
		Handles Me.Startup

			e.Cancel = True

			Dim argv As String() = System.Environment.GetCommandLineArgs
			If argv.Length = 1 Then
				Exit Sub
			End If

			' argv(1) が第一引数
			' argv(2) がインデックス
			' argv(3) が画像名(拡張子なし)

			Dim hInst As System.IntPtr
			Dim hIcon As System.IntPtr
			Dim pIconCount As System.IntPtr
			Dim nIconCount As Integer

			hInst = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()(0))

			pIconCount = ExtractIcon(hInst, argv(1), -1)
			'アイコンの総数を取得 
			If pIconCount.Equals(IntPtr.Zero) Then
				'アイコンがなかった 
				MessageBox.Show("アイコンがありません")
				Exit Sub
			End If

			nIconCount = pIconCount.ToInt32()
			If Integer.Parse(argv(2)) > nIconCount - 1 Then
				'インデックスオーバー 
				MessageBox.Show("対象となるアイコンがありません")
				Exit Sub
			End If

			hIcon = ExtractIcon(hInst, argv(1), Integer.Parse(argv(2)))

			Dim targetIcon As Icon = Icon.FromHandle(hIcon)
			Dim targetBmp As Bitmap = targetIcon.ToBitmap()

			targetBmp.Save(argv(3) + ".png", Imaging.ImageFormat.Png)

			' 全て破棄
			targetBmp.Dispose()
			targetIcon.Dispose()
			DestroyIcon(hIcon)

		End Sub

	End Class

End Namespace

■ 関連する別サイトの記事


タグ:Win32API icon
posted by at 2009-06-06 17:56 | VB.NET Framework2.0 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します