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だけで書くことが出来るようになっている。