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 は取得できないのかな?
もう少し調べる。