SHGetImageListのテスト

SHGetImageList APIをHSPから使ってみるテストです。256×256のコンピュータアイコンを表示します。

SHGetImageList APIをHSPから使ってみるテストです。256×256のコンピュータアイコンを表示します。

  • タグ:
  • タグはありません
// SHGetImageListのテスト by akk026

#uselib "shell32.dll"
#func SHGetFileInfo "SHGetFileInfoA" sptr, int, int, int, int
#func SHGetFolderLocation "SHGetFolderLocation" int, int, int, int, int
#func SHGetImageList "SHGetImageList" int, int, int

#uselib "user32.dll"
#func DrawIconEx "DrawIconEx" int, int, int, int, int, int, int, int, int
#func DestroyIcon "DestroyIcon" int

#uselib "ole32.dll"
#func CoTaskMemFree "CoTaskMemFree" int
#func IIDFromString "IIDFromString" wstr, var

#define CLSID_ImageList "{7C476BA2-02B1-48f4-8048-B24619DDC058}"
#define IID_IImageList  "{46EB5926-582E-4017-9FDF-E8998DAA0950}"

#define CSIDL_DRIVES        0x11

#define SHGFI_PIDL          0x00000008
#define SHGFI_ICON          0x00000100
#define SHGFI_DISPLAYNAME   0x00000200
#define SHGFI_TYPENAME      0x00000400
#define SHGFI_SYSICONINDEX  0x00004000

#define SHIL_JUMBO          4

#define ILD_TRANSPARENT     0x00000001

#define DI_NORMAL           0x00000003

#usecom IImageList IID_IImageList CLSID_ImageList
#comfunc IImageList_GetIcon 10 int, int, var

// SHGetImageList関数が存在するか確認
if varptr(SHGetImageList) == 0 {
	dialog "SHGetImageList APIが見つかりません"
	stop
}

dim pidl, 1
dim sfi, 88
dim iid, 4
dimtype ImageList, vartype("comobj"), 1
sdim DisplayName, 260
sdim TypeName, 80

// PIDLの取得
SHGetFolderLocation 0, CSIDL_DRIVES, 0, 0, varptr(pidl)
if stat != 0 {
	dialog "PIDLの取得に失敗しました"
	stop
}

// システムアイコンのインデックスを取得
SHGetFileInfo pidl, 0, varptr(sfi), 352, SHGFI_PIDL | SHGFI_ICON | SHGFI_TYPENAME | SHGFI_DISPLAYNAME | SHGFI_SYSICONINDEX

// IID_IImageList型のCOMオブジェクトを取得
IIDFromString IID_IImageList, iid
SHGetImageList SHIL_JUMBO, varptr(iid), varptr(ImageList)
if stat != 0 {
	dialog "イメージリストの取得に失敗しました"
	stop
}

// アイコンハンドルの取得
IImageList_GetIcon ImageList, sfi.1, ILD_TRANSPARENT, hIcon

// COMオブジェクトを破棄
delcom ImageList

if hIcon == 0 {
	dialog "アイコンハンドルの取得に失敗しました"
	stop
}

// アイコンの描画
DrawIconEx hdc, 50, 50, hIcon, 256, 256, 0, 0, DI_NORMAL
DestroyIcon hIcon

// 再描画
redraw

pos 330, 150

// アイコンの情報を表示
memcpy DisplayName, sfi, 260, 0, 12
memcpy TypeName, sfi, 80, 0, 272
mes DisplayName
mes TypeName

stop