1

以下は、ctypes を使用して dll の値にアクセスしているコードです。

私の意図は、構造フィールドのアドレスを保存することです。構造体の値が変更されるたびに、アドレスにアクセスして変更された値を取得できます。

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  

ポインターを介して、値は変更されていません.remains 0

4

1 に答える 1

4

問題は、元の構造とは異なるメモリを占有in_fieldする新しいオブジェクトです。c_int必要なのは、元のオブジェクトのメモリを共有するc_int.from_buffer( docs ) です。次に例を示します。

x.cでコンパイルされたWindows DLL ソースcl /LD x.c:

struct MyStruct
{
    int one;
    int two;
};

__declspec(dllexport) struct MyStruct myStruct = {1,2};

Python スクリプト:

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)
于 2012-08-29T12:26:10.990 に答える