主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ
書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。
2022/12/20
Blender アドオン作るときの小ネタ。
例えば、 Python では性能上厳しかったり、何らかの理由で Python から触れない何かを触りたい場合、 C++ で Blender のアドオンを書きたいケースがあります。
そういったことをやりたいときの方法をメモしておきます。
といっても、通常のアドオンと同様、 Python で記述して、そこから DLL の関数を呼び出す、といった感じになります。
import ctypes
dll: ctypes.CDLL
def register():
global dll
dll = ctypes.cdll.LoadLibrary("/path/to/library.dll")
def unregister():
global dll
if dll is not None:
import _ctypes
_ctypes.FreeLibrary(dll._handle)
DLL のロード、アンロードはこんな感じで出来ます。
ctypes
は、 Python 向けの外部関数ライブラリで、標準ライブラリーとして Blender にも読み込まれており、
そこから外部 DLL をロード・アンロードすることができます。
FreeLibrary
については特にドキュメントに記載はされていませんが、関数としては存在しており、これに DLL のハンドルを渡すことで、明示的にアンロードすることができます。
Blender アドオンの場合は、有効・無効ボタンがあるため、無効ボタンを押下されたタイミングで unregister
が走るので、そのときに適切に FreeLibrary
を呼び出す必要があります。
ちなみに Kernel32 を直叩きしても良いとは思うけど、 x64 にて定義がミスってるという報告が見受けられるので、そこだけご注意を。