Below is the code where I'm accessing the values of dll using ctypes.
My intention is to store the structure fields addresses. Whenever the values in the structure changes ,I can access the addresses and get changed values.
DUMMY_DLL_PATH = "dummyModel.dll"
class MyStruct(ctypes.Structure):
_fields_ = [("field_one", ctypes.c_int),
("field_two", ctypes.c_int)]
d_m = ctypes.cdll.LoadLibrary(DUMMY_DLL_PATH)
d_i = MyStruct.in_dll(d_m,"dummy_In")
in_field = ctypes.c_int(d_i.field_one)
#storing the address
b = ctypes.addressof(in_field)
b_v = ctypes.cast(b,ctypes.POINTER(ctypes.c_int))
k= b_v.contents
print 'before',d_i.field_one,k.value
#changing the value
d_i.field_one = 10
print 'After',d_i.field_one,k.value
Before 0 0
After 10 0
Through pointers, the values are not getting changed.remains 0
The problem is in_field
is a new c_int
object occupying different memory than the original structure. What you want is c_int.from_buffer
( docs ) which shares the memory of the original object. Here's an example:
xc
compiled with cl /LD xc
: struct MyStruct
{
int one;
int two;
};
__declspec(dllexport) struct MyStruct myStruct = {1,2};
from ctypes import *
class MyStruct(Structure):
_fields_ = [
("one", c_int),
("two", c_int)]
def __repr__(self):
return 'MyStruct({},{})'.format(self.one,self.two)
dll = CDLL('x')
struct = MyStruct.in_dll(dll,"myStruct")
alias1 = c_int.from_buffer(struct, MyStruct.one.offset)
alias2 = c_int.from_buffer(struct, MyStruct.two.offset)
print struct
print 'before',alias1,alias2
struct.one = 10
struct.two = 20
print 'after',alias1,alias2
MyStruct(1,2)
before c_long(1) c_long(2)
after c_long(10) c_long(20)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.