[2363] Re^4: 32×32アイコンの抽出方法

投稿日 2019/01/31(Thu) 22:33:45
投稿者 通り道
参照先

こんにちは。
ざっと実装すると、以下のような感じでしょうか。参考までに。
プロデル、結構、プロデル外の機能を使う命令が充実していますね。
本体側の命令でも取り出せるようになるのではと思います。
なお、アイコン抽出という名前なのですが、実際には、指定したファイルから
アイコンを抽出しているのではなく、指定したファイルやフォルダについて、
エクスプローラーが表示する際に使用するアイコンを取得する機能になります。
基本的に、実行ファイルは、その実行ファイル内の最初のアイコンになりますが、
フォルダやデータファイルは、関連付けられているアプリケーションのアイコンに
なります。
また、256サイズのアイコンは、古いOSでは取得できない可能性があります。
(48サイズは、XP以降ならば大丈夫のはず)
--------------------
アイコン抽出支援とは
 −IntPtr型
 −Icon型
 −SHGetFileInfo
 −SHGetImageList
 −UuidFromString
 −DestroyIcon
 −ImageList_GetIcon

 −SHGFI_LARGEICON:整数=0x000000000
 −SHGFI_SMALLICON:整数=0x000000001
 −SHGFI_ADDOVERLAYS:整数=0x000000020
 −SHGFI_OVERLAYINDEX:整数=0x000000040
 −SHGFI_ICON:整数=0x000000100
 −SHGFI_SYSICONINDEX:整数=0x000004000
 −SHGFI_LINKOVERLAY:整数=0x000008000
 −SHGFI_SELECTED:整数=0x000010000
 −SHIL_LARGE:整数=0x0
 −SHIL_SMALL:整数=0x1
 −SHIL_EXTRALARGE:整数=0x2
 −SHIL_SYSSMALL:整数=0x3
 −SHIL_JUMBO:整数=0x4
 −ILD_NORMAL:整数=0x0000
 −ILD_TRANSPARENT:整数=0x0001

 −IID_IImageList

 はじめの手順
  ' 使用するドットネット型を取得
  IntPtr型は、ドットネット型(「System.IntPtr」)を作る
  Icon型は、ドットネット型(「System.Drawing.Icon」)を作る
  ' 使用するネイティブ関数を取得
  SHGetFileInfoは、ネイティブ関数(ファイル名「Shell32.dll」、関数名「SHGetFileInfoA」)を作る
  SHGetFileInfoの引数型一覧は、{文字列,整数,SHFILEINFO,整数,整数}
  SHGetFileInfoの戻り値型は、整数

  SHGetImageListは、ネイティブ関数(ファイル名「Shell32.dll」、関数名「SHGetImageList」)を作る
  SHGetImageListの引数型一覧は、{整数,GUID,ポインタ}
  SHGetImageListの戻り値型は、整数

  UuidFromStringは、ネイティブ関数(ファイル名「Rpcrt4.dll」、関数名「UuidFromStringA」)を作る
  UuidFromStringの引数型一覧は、{文字列,GUID}
  UuidFromStringの戻り値型は、整数

  DestroyIconは、ネイティブ関数(ファイル名「user32.dll」、関数名「DestroyIcon」)を作る
  DestroyIconの引数型一覧は、{整数}
  DestroyIconの戻り値型は、整数

  ImageList_GetIconは、ネイティブ関数(ファイル名「Comctl32.dll」、関数名「ImageList_GetIcon」)を作る
  ImageList_GetIconの引数型一覧は、{整数,整数,整数}
  ImageList_GetIconの戻り値型は、整数
  
  IID_IImageListというGUIDを作る
  UuidFromStringを{「46EB5926-582E-4017-9FDF-E8998DAA0950」,IID_IImageList}で呼び出して結果とする
  もし、結果が0でなければ、
   「初期化に失敗しました」というエラーを発生させる
  もし終わり
 終わり
 自分で[ファイル名]から小アイコン取得する手順:プロデルアイコン
  【パラメータ】というSHFILEINFOを作る
  SHGetFileInfoを{ファイル名,0,パラメータ,SHFILEINFOの構造体バイト数, SHGFI_ICON+SHGFI_SMALLICON}で呼び出して【結果】とする
  もし、結果が0ならば、
   空を返す
  もし終わり
  もし、パラメータのhIconが0ならば、
   空を返す
  もし終わり
  【iconhandle】は、IntPtr型から{パラメータのhIcon}でインスタンスを作る
  Icon型から「FromHandle」を{iconhandle}で呼び出して【取得アイコン】とする
  もし、取得アイコンが0ならば、
   空を返す
  もし終わり
  取得アイコンを返す
 終わり
 自分で[ファイル名]から大アイコン取得する手順:プロデルアイコン
  【パラメータ】というSHFILEINFOを作る
  SHGetFileInfoを{ファイル名,0,パラメータ,SHFILEINFOの構造体バイト数, SHGFI_ICON+SHGFI_LARGEICON}で呼び出して【結果】とする
  もし、結果が0ならば、
   空を返す
  もし終わり
  もし、パラメータのhIconが0ならば、
   空を返す
  もし終わり
  【iconhandle】は、IntPtr型から{パラメータのhIcon}でインスタンスを作る
  Icon型から「FromHandle」を{iconhandle}で呼び出して【取得アイコン】とする
  もし、取得アイコンが0ならば、
   空を返す
  もし終わり
  取得アイコンを返す
 終わり
 自分で[ファイル名]から巨大アイコン取得する手順:プロデルアイコン
  【パラメータ】というSHFILEINFOを作る
  SHGetFileInfoを{ファイル名,0,パラメータ,SHFILEINFOの構造体バイト数, SHGFI_SYSICONINDEX}で呼び出して【imglist】とする
  もし、imglistが0ならば、
   空を返す
  もし終わり
  もし、パラメータのhIconが0でなければ、
   DestroyIconを{パラメータのhIcon}で呼び出す
  もし終わり
  【imglist参照】は、ネイティブ参照(型整数)を作る
  SHGetImageListを{SHIL_EXTRALARGE,IID_IImageList,imglist参照}で呼び出して【結果】とする
  もし、結果が0でなければ、
   空を返す
  もし終わり
  imglistは、imglist参照の値
  ImageList_GetIconを{imglist,パラメータのiIcon,ILD_TRANSPARENT}で呼び出して結果とする
  【iconhandle】は、IntPtr型から{結果}でインスタンスを作る
  Icon型から「FromHandle」を{iconhandle}で呼び出して【取得アイコン】とする
  もし、取得アイコンが0ならば、
   空を返す
  もし終わり
  取得アイコンを返す
 終わり
 自分で[ファイル名]から超大アイコン取得する手順:プロデルアイコン
  【パラメータ】というSHFILEINFOを作る
  SHGetFileInfoを{ファイル名,0,パラメータ,SHFILEINFOの構造体バイト数, SHGFI_SYSICONINDEX}で呼び出して【imglist】とする
  もし、imglistが0ならば、
   空を返す
  もし終わり
  【imglist参照】は、ネイティブ参照(型整数)を作る
  SHGetImageListを{SHIL_JUMBO,IID_IImageList,imglist参照}で呼び出して【結果】とする
  もし、結果が0でなければ、
   空を返す
  もし終わり
  もし、パラメータのhIconが0でなければ、
   DestroyIconを{パラメータのhIcon}で呼び出す
  もし終わり
  imglistは、imglist参照の値
  ImageList_GetIconを{imglist,パラメータのiIcon,ILD_TRANSPARENT}で呼び出して結果とする
  【iconhandle】は、IntPtr型から{結果}でインスタンスを作る
  Icon型から「FromHandle」を{iconhandle}で呼び出して【取得アイコン】とする
  もし、取得アイコンが0ならば、
   空を返す
  もし終わり
  取得アイコンを返す
 終わり

終わり

SHFILEINFOとは
 ネイティブ構造体を受け継ぐ
 +hIcon:整数
 +iIcon:整数
 +dwAttributes:整数
 +szDisplayName:文字列
 +szTypeName:文字列
 はじめの手順
  自分で初期化する
  「szDisplayName」を256文字設定する
  「szTypeName」を80文字設定する
 終わり
終わり

GUIDとは
 ネイティブ構造体を受け継ぐ
 +Data1:整数   ' 00000000-
+Data2:短整数 ' 0000-
+Data3:短整数 ' 0000-
+Data4A:整数  ' C000-0000
+Data4B:整数  ' 00000046
 はじめの手順
  自分で初期化する
 終わり
終わり

メイン画面を表示する
待機

メイン画面とは
 ウィンドウを継承
 はじめの手順
  この大きさを{400,370}に変える
  画像領域Aというピクチャーを作る
  その位置と大きさは、{0,0,16,16}
  その背景色を白に変える
  その表示を○に変える
  画像領域Bというピクチャーを作る
  その位置と大きさは、{20,0,32,32}
  その背景色を白に変える
  その表示を○に変える
  画像領域Cというピクチャーを作る
  その位置と大きさは、{60,0,48,48}
  その背景色を白に変える
  その表示を○に変える
  画像領域Dというピクチャーを作る
  その位置と大きさは、{120,0,256,256}
  その背景色を白に変える
  その表示を○に変える
  ファイルパスというテキストを作る
  その位置と大きさは、{10,270,360,18}
  その内容は、「C:\」
  テスト実行ボタンというボタンを作る
  その位置と大きさは、{150,290,100,20}
  その内容は、「テスト実行」
  そのクリックされた時の手順は、テスト実行
 終わり
終わり

[ファイル名]をサイズ確認する手順
 【結果】
 【結果画像】
 結果は、アイコン抽出支援でファイル名から小アイコン取得する
 もし、結果が空でなければ、
  メイン画面の画像領域Aの画像は、結果を画像化する
 もし終わり
 結果は、アイコン抽出支援でファイル名から大アイコン取得する
 もし、結果が空でなければ、
  メイン画面の画像領域Bの画像は、結果を画像化する
 もし終わり
 結果は、アイコン抽出支援でファイル名から巨大アイコン取得する
 もし、結果が空でなければ、
  メイン画面の画像領域Cの画像は、結果を画像化する
 もし終わり
 結果は、アイコン抽出支援でファイル名から超大アイコン取得する
 もし、結果が空でなければ、
  メイン画面の画像領域Dの画像は、結果を画像化する
 もし終わり
終わり

[ファイル名]をテスト実行する手順
 メイン画面のファイルパスの内容をサイズ確認する
終わり


関連一覧ツリー

をクリックするとツリーを一括表示します)

返信フォーム

(この投稿に返信する場合は下記フォームから投稿して下さい)
(1MBまで)
(英数字で8文字以内)

- 投稿修正/削除フォーム -
処理 No パスワード

▲ページの先頭へ

- WebForum -