Yazılabilir bir buffer
varsa, bu arabelleğe bir C işaretçisi almak için ctypes.c_void_p.from_buffer
işlevini kullanabilirim.const void * ktiplerde işaretçi
Yazılabilir olmayan arabelleklerle nasıl baş edilir? Yazılabilir olmayan bir arabelleğin yazılabilir bir kopyasına başvurmadan başvurmak için const void*
beklediğim C koduna geçebilmem için const
işaretçisi nasıl oluşturulur?
c_void_p.from_address
kabul ettim ancak arabellek (ve bellek görüntülemeleri) adreslerini göstermiyor gibi görünüyor.
Bazı açıklama:
>>> import ctypes
>>> b = buffer("some data that supports the buffer interface, like a str")
>>> ptr = ctypes.c_void_p.from_buffer(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: buffer is read-only
>>> ptr = ctypes.c_void_p.from_buffer_copy(b) # works, but has to copy data
>>> ptr = ctypes.CONST(c_void_p).from_buffer(b) # (I'm making this one up)
>>> ptr = ctypes.c_void_p.from_address(???) # could work; how to get addr?
void some_api(const void* read_only_data)
gibi çalışmak olacaktır:
>>> ctypes.cdll.LoadLibrary(some_lib).some_api(ptr)
yöntem from_buffer_copy
ile çalışır, ancak ilk tampon kopyalaması gerekiyor. Tamponun yazılabilir olma zorunluluğu etrafında çalışmak için bir yol arıyorum, çünkü hiç kimse oraya yazacak ve gereksiz verilerin kopyalanmasını önlemek istiyorum.
Örnek bir kod verebilir misiniz? – ebarr
İşte gidiyoruz, umarım şimdi açık olur – Kos
Bu yararlı olabilir http://stackoverflow.com/questions/121396/accessing-object-memory-address. Buradaki önerilerle uğraşmayı denedim, ancak sınırlı başarı ile. Hile, arabellek almak ve adresini döndürmek için bir PythonC_API işlevi yazması daha olasıdır. Bu nispeten kolay olmalı. – ebarr