Visual Studioなどで作成したWin32 DLL Dynamic Link LibraryをPythonで呼び出す際に[例外が発生しました:AttributeError function not found]が表示された場合の対処法を紹介します。
ctypesのインストール
外部モジュールを取り扱うためのライブラリとしてctypesが必要になります。Python 3がインストールされている場合、既定値でctypesはインストールされているので問題ないですが、pipコマンドを使ってctypesをインストールすることができます。
例外が発生しました:function not found
Visual Studioなどで作成したWindows DLLをPythonのctypesライブラリで呼び出した際に[例外が発生しました:AttributeError function (実際の関数名) not found]が表示される場合があります。
関数の修飾子を確認する
__declspec 構文で関数をエクスポートしている場合には、extern “C” を使って明示的にエクスポートを宣言するように変更します。
具体的には次のような形でDLLでエクスポートする関数を定義します。
extern "C" __declspec(dllexport) void __cdecl show_message(void)
{
MessageBox(NULL, TEXT("DLLが表示しています"), TEXT("show_message"), MB_OK);
}
extern "C" __declspec(dllexport) int __cdecl increment_value(int n)
{
n++;
return n;
}
まとめ
Visual Studioなどで作成したWindows DLLをPythonのctypesライブラリで呼び出した際に[例外が発生しました:AttributeError function (実際の関数名) not found]が表示された場合には、DLLのソースコードで関数のエクスポートを定義している部分で extern “C” を使って明示的にエクスポートを宣言するように変更します。
Windowsのネイティブな機能を利用する場合は、PythonよりもWin32 DLLの方が高速で高度な操作をすることができるので、DLLを利用できることは便利です。
スポンサーリンク
最後までご覧いただき、ありがとうございます。