Python3でctypesを使ってWindowsの特殊フォルダを開く関数のコードとそれを書く過程で学んだことです。
フォントフォルダを開く
import os
import ctypes
from ctypes import oledll, wintypes
def getshellfolderpath(csidl: int) -> str:
if not isinstance(csidl, int):
raise TypeError
SHGetFolderPathW = oledll.shell32.SHGetFolderPathW
SHGetFolderPathW.argtypes = [
wintypes.HWND, ctypes.c_int, wintypes.HANDLE,
wintypes.DWORD, wintypes.LPWSTR]
path = ctypes.create_unicode_buffer(wintypes.MAX_PATH)
SHGetFolderPathW(0, csidl, 0, 0, path)
return path.value
CSIDL_FONTS = 0x0014
os.startfile(getshellfolderpath(CSIDL_FONTS))
- Python 3では標準ライブラリのctypesを使ってWin32 APIを操作できる。
- Win32 APIの一般的な型(
HWND
、DWORD
等)はctypes.wintypes
に定義されている。 -
ctypes
は動的リンクライブラリのロードのためにcdll
、pydll
、windll
、oledll
をエクスポートする。cdll
、pydll
はcdecl呼び出し規約、windll
とctypes.oledll
はstdcall呼び出し規約。ctypes.oledll
は戻り値をHRESULT
と仮定して失敗時にOSError
を送出する。公式ドキュメント。 -
WCHAR
型のバッファーはctypes.create_unicode_buffer
関数で作成する。戻り値のvalue
で文字列を取得できる。公式ドキュメント。 - ファイル/フォルダを関連付けで開くには
os.startfile
関数が使える。