ctypesで関数ポインタを扱う
ctypesを使うとDLLが呼び出せることを前に書いた。
こんな感じで。
from ctypes import * user32 = windll.user32 user32.MessageBoxW(0, u'Python ctypes test', 0, 0)
ctypesの便利さはこんなものじゃない。
Pythonの関数を関数ポインタのように扱って、callback関数にしたり、CreateThreadしたりできる。
from ctypes import * user32 = windll.user32 kernel32 = windll.kernel32 def callbackFunction(): user32.MessageBoxW(0, u'MessageBox from callback function', 0, 0) return 0 functionType = CFUNCTYPE(c_int) functionPointer = functionType(callbackFunction) threadId = c_ulong(0) threadHandle = kernel32.CreateThread(0, 0, functionPointer, 0, 0, byref(threadId)) result = kernel32.WaitForSingleObject(threadHandle, 60*1000) if result: print('Timeout') else: print('Thread exited')
ctypesのおかげでWin32 API使ったコードでも、こんなに簡単にPythonだけで書くことが出来るようになっている。