2012-02-09 97 views
0

我在一個DLL中通過ctypes調用回一個Python函數中有一個C函數。將數據添加到傳遞給Python Ctypes回調的C緩衝區

C函數調用用以下原型函數:

void GetData(u8 Buffer[], u16 Length); 

注意,緩衝器指向其在DLL保持的靜態數據數組。

我產生了這樣的Python函數類型如下:

CFUNCTYPE(None, c_char_p, c_int) 

而且我的Python回調函數被調用,沒有任何明顯的問題。

我的問題是,我無法弄清楚如何讓ctypes將原始數據添加到Python外部的緩衝區。有沒有辦法來定義一個ctypes字符串緩衝區並給它的DLL緩衝區的地址?

回答

2

您可以使用libc中的memcpy。如果您c_char_pbufferc_intbufferlen

libc = ctypes.cdll.LoadLibrary('libc.so.6') 
content = 'My new content' 
bufcontent = ctypes.create_string_buffer(content) 
libc.memcpy(buffer. newcontent, min(len(content) + 1, bufferlen)) 

你一樣會在C做(請注意,我用可能的二進制內容的memcpy,但如果你不關心它,使用strncpy代替

+2

謝謝您的回答 - 你真的指着我沿着正確的線: - 我發現ctypes的有它包裝的memcpy一個的memmove功能 - 所以我沒有需要進口的libc。我唯一需要做的另一件事是聲明我的函數類型爲CFUNCTYPE(無,POINTER(c_char),c_int)而不是CFUNCTYPE(無,c_char_p,c_int) 。 – 2012-02-10 09:40:14