なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

Blender アドオンで C++ で記述した DLL をロード・アンロードしたい

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 にて定義がミスってるという報告が見受けられるので、そこだけご注意を。