IronPython SHGetFileInfoW is ctypes

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

python_list

よし動いた。
後下記をコレで書いてみようと思ったけど何故か Image が取得できない。

C# で SHGetFileInfo を使ってアイコンと種類を取ってくる例

c_voidp で HICON は取得できないのかな?
もう少し調べる。