P_get
'P' ポインター タイプの場合は を使用しPyLong_FromVoidPtr
ます。アドレスがプラットフォームに適合する場合、long
Python を返しますint
。long
それ以外の場合は、変数の精度を持つPython を返します。それは問題ありませんが、この整数値を引数として渡す場合、デフォルトの動作は、サポートされているすべてのプラットフォームで 32 ビットである C に変換することです。int
argtypes
最善の解決策は、引数をポインター型に適切に変換するように設定することだと思います。別のオプションはrestype
、 のサブクラスに設定することですc_void_p
。サブクラスを使用すると、Python 整数への変換が無効になります。GetResult
を呼び出してこれをチェックし_ctypes_simple_instance
ます。実際には、その名前とソース コメントが示唆するものとは反対の結果を返します。(2.5IsSimpleSubType
では、この関数は という名前でしたが、当時はソース コメントも間違っていました。問題の「単純」は決して metaclassPyCSimpleType
ではなく、基本型_SimpleCData
でした。)
POSIX:
# Configure the interpreter to load visible extension-
# module symbols, such as _ctypes_simple_instance,
# into the global symbol table.
import sys, DLFCN
sys.setdlopenflags((sys.getdlopenflags() & ~DLFCN.RTLD_LOCAL) |
DLFCN.RTLD_GLOBAL)
from ctypes import *
_ctypes_simple_instance = PyDLL(None)._ctypes_simple_instance
_ctypes_simple_instance.argtypes = py_object,
malloc = CDLL(None).malloc
class my_void_p(c_void_p):
pass
>>> _ctypes_simple_instance(c_void_p)
0
>>> _ctypes_simple_instance(my_void_p)
1
>>> malloc.restype = c_void_p
>>> type(malloc(100))
<type 'int'>
>>> malloc.restype = my_void_p
>>> type(malloc(100))
<class '__main__.my_void_p'>
ウィンドウズ:
_ctypes_simple_instance
_ctypes.pyd によってエクスポートされません。
from ctypes import *
malloc = cdll.msvcrt.malloc
class my_void_p(c_void_p):
pass
>>> malloc.restype = c_void_p
>>> type(malloc(100))
<class 'int'>
>>> malloc.restype = my_void_p
>>> type(malloc(100))
<class '__main__.my_void_p'>