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 でファイル名を渡してたから上手くいかなかったのね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #-*- 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 は取得できないのかな?
もう少し調べる。