2012-12-12 25 views
6

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.

+0

Örnek bir kod verebilir misiniz? – ebarr

+1

İşte gidiyoruz, umarım şimdi açık olur – Kos

+0

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

cevap

0

Python dizesini char*'a ktip yazabilir ve buradaki gerçek belleğe işaret eden Python dizesi verileri saklanır.

Çift döküm yapmaktan çekinmeyin.