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