single.php

PythonでctypesでDLL読込時に[function not found]と表示された場合の対処法

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を利用できることは便利です。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です