これはおそらく、コンパイラが関数名をマングリングしたためです。この問題を回避するには、次の 2 つの方法があります。
- 名前をマングルしないようにコンパイラーに指示するようにコードを修正してください。(外部参照を追加したルックアップ)
- マングルされた名前を見つけて、Python から呼び出します (以下の説明を参照してください)。
以下を読んでください(http://docs.python.org/2/library/ctypes.htmlから)
DLL は、"??2@YAPAXI@Z" のように、有効な Python 識別子ではない名前の関数をエクスポートすることがあります。この場合、getattr() を使用して関数を取得する必要があります。
>>>
>>> getattr(cdll.msvcrt, "??2@YAPAXI@Z")
<_FuncPtr object at 0x...>
>>>
Windows では、一部の dll は関数を名前ではなく序数でエクスポートします。これらの関数は、序数で dll オブジェクトにインデックスを付けることでアクセスできます。
>>>
>>> cdll.kernel32[1]
<_FuncPtr object at 0x...>
>>> cdll.kernel32[0]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "ctypes.py", line 310, in __getitem__
func = _StdcallFuncPtr(name, self)
AttributeError: function ordinal 0 not found
>>>
関数名がわからない場合は、link.exe dumpbin.exe を調べてください。これらは Visual Studio のインストールで検出され、dll で使用可能なすべての関数をダンプします。結果に対して grep を実行できます。