2013-07-02 3 views
0

у меня есть этот код C++ в Linux Ubuntu я хочу использовать этот метод в Python с помощью CType , но не могу отправить параметр в ctype.cdl.funcionCTYPE в питоне

C++ код:

extern "C" unsigned char* getuserdata(int code,unsigned char* globalkey,unsigned char* key) 
{ 
     unsigned char data[256]; 
     KeyA *keya;   
     keya=new KeyA; 
     keya->OpenDevice(0); 
     keya->Init(globalkey,globalkey,globalkey,globalkey); 
     keya->ReadUserMemory(0,256,key,data); 
     return data;  
} 

образца использовать эту функцию в C++:

unsigned char g_user[16] = { 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22 }; 
unsigned char publickey[16] = { 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55 }; 
printf("function Return: %s\n", getuserdata(0,publickey,g_user)); 

и мой исходный код питона (не работал !!) является:

from ctypes import * 
dl=cdll.LoadLibrary('/home/iman/KCore/kcore/hkey.so'); 
dl.getuserdata.restype = c_char_p 
string_buffers = [addressof(create_string_buffer(16)) ] 
string_buffers[0]= "5555555555555555"; 
string_buffers2 = [addressof(create_string_buffer(16)) ] 
string_buffers2[0]="2222222222222222"; 
st= dl.getuserdata(0,string_buffers,string_buffers2); 
print st+"\n"; 
+2

'data' находится в стеке и уничтожается после возвращения функции. Вы возвращаете указатель на объект, который больше не существует. Другими словами, эта функция нарушается независимо от того, как вы ее называете, ctypes не влияет на нее. О, и 'keya' просочился, что является еще одной причиной его перезаписи. –

+0

Можете ли вы отправить мне истинный код C++ и python? –

ответ

1

Давайте посмотрим на код ...

string_buffers = [addressof(create_string_buffer(16)) ] 

Эта строка создает список Python, содержащий адрес строки буфера 16 байт (или, может быть, это не байт, но символы, пожалуйста, найти, что из себя).

string_buffers[0]= "5555555555555555"; 

Эта строка заменяет указатель сверху строкой «555555555555555».

dl.getuserdata(0,string_buffers,string_buffers2); 

Здесь вы передаете список со строкой в ​​функцию, а функция принимает указатель на байты. Вопрос заключается в том, чего вы хотите достичь здесь, то есть хотите ли вы, чтобы буфер был записан или нет. Если нет, используйте const в C++ и просто передайте "22222" в качестве параметра, ctypes сделает все остальное за вас автоматически.

Это может быть так, что я предполагаю, что неправильно, поскольку вы не объяснили, что именно происходит (цитируйте сообщения об ошибках!) И как именно вы определили, что что-то не работает. Кроме того, вы должны очистить свой сломанный код C++ или временно заменить его чем-то меньшим, что более подходит для объяснения точной проблемы.

 Смежные вопросы

  • Нет связанных вопросов^_^