Re: [ctypes-users] Setting values exported by a DLL
Brought to you by:
theller
From: Thomas H. <th...@ct...> - 2006-12-21 19:29:06
|
Scott Dial schrieb: > > Second, there seems to be no way to set the value of variable which is > > a pointer to a function. For instance: > > > > >>> FUNC = CFUNCTYPE(None) > > >>> FUNC.in_dll(pythonapi, "PyOS_InputHook") > > <ctypes.CFunctionType object at 0x00880B70> > > >>> FUNC.in_dll(pythonapi, "PyOS_InputHook").value > > Traceback (most recent call last): > > File "<stdin>", line 1, in ? > > AttributeError: 'CFunctionType' object has no attribute 'value' > > > > How can I modify it? > > And, this is the actual types of values I wanted to set for an external > library. First of all, AFAIK the PyOS_InputHook is a POINTER(FUNC) and > not a FUNC. Maybe this will only add to the confusion, but CFUNCTYPE(something) is a pointer to a function, and not a function (there are no function data types in C, only pointers to functions). Instances of CFUNCTYPE have no value attribute, neither mutable nor immutable. So, there is no way to change them without either using memmove or some casting into a mutable type. Here is a code snippet that actually works, and is maybe a little bit more elegant than the memmove approach: """ import sys from ctypes import * ptr = c_void_p.in_dll(pythonapi, "PyOS_InputHook") FUNC = CFUNCTYPE(c_int) def my_input_hook(): sys.stdout.write("+") return 1 func = FUNC(my_input_hook) ptr.value = cast(func, c_void_p).value """ To prove the first point I made; after executing the above, you can get the function pointer again and call it from Python: """ f = FUNC.in_dll(pythonapi, "PyOS_InputHook") f() """ Hope that helps. Maybe this should go into the wiki? Or should someone work on a patch that implements a mutable .value attribute (or better __getitem__ and __setitem__ support) for *FUNCTYPE objects? Thomas |