Re: SHGetFileInfo :: ASPN Mail Archive :: python-list
の IronPython 化が解った。
HICON は ctypes.c_voidp or ctype.c_void_pにすれば x86,x64 両方に対応できる。
追記: c_voidp は後方互換性で残っているだけのようで…
x64 のみでいいなら ctypes.int64 でもいいみたいだけど…
違いは何なのだろう?もう少しソースコードを見てみよう。
ついでに UNICODE Function 化、x64 で ANSI なんて悲しすぎる。
つか IronPython は内部が UNICODE や…
ANSI 関数に UNICODE でファイル名を渡してたから上手くいかなかったのね。
#-*- coding:utf-8 -*-
from ctypes import *
MAX_PATH = 260
HICON = c_void_p
# SHFILEINFOW
class SHFILEINFOW(Structure):
_fields_ = [("hIcon", HICON),
("iIcon", c_int),
("dwAttributes", c_uint),
("szDisplayName", c_wchar * MAX_PATH),
("szTypeName", c_wchar * 80)]
SHGFI_ICON = 0x000000100
SHGFI_DISPLAYNAME = 0x000000200
SHGFI_TYPENAME = 0x000000400
SHGFI_ATTRIBUTES = 0x000000800
SHGFI_ICONLOCATION = 0x000001000
SHGFI_EXETYPE = 0x000002000
SHGFI_SYSICONINDEX = 0x000004000
SHGFI_LINKOVERLAY = 0x000008000
SHGFI_SELECTED = 0x000010000
SHGFI_ATTR_SPECIFIED = 0x000020000
SHGFI_LARGEICON = 0x000000000
SHGFI_SMALLICON = 0x000000001
SHGFI_OPENICON = 0x000000002
SHGFI_SHELLICONSIZE = 0x000000004
SHGFI_PIDL = 0x000000008
SHGFI_USEFILEATTRIBUTES = 0x000000010
shfileinfo = SHFILEINFOW()
import sys
# SHGetFileInfoW
flags = SHGFI_DISPLAYNAME | SHGFI_TYPENAME | SHGFI_ATTRIBUTES
print windll.shell32.SHGetFileInfoW(sys.executable,
0,
byref(shfileinfo),
sizeof(shfileinfo),
flags)
# print no repr
print hex(shfileinfo.dwAttributes)
print shfileinfo.szDisplayName
print shfileinfo.szTypeName
よし動いた。
後下記をコレで書いてみようと思ったけど何故か Image が取得できない。
C# で SHGetFileInfo を使ってアイコンと種類を取ってくる例
c_voidp で HICON は取得できないのかな?
もう少し調べる。
