我在Linux ubuntu中有这个C ++代码我希望在cthon中使用python中的这个方法 但无法将参数发送到ctype.cdl.funcion
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));
和我的python源代码(不是Worked !!)是:
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";
答案 0 :(得分:1)
让我们看一下代码......
string_buffers = [addressof(create_string_buffer(16)) ]
这一行创建一个包含16字节字符串缓冲区地址的Python列表(或者它可能不是字节而是字符,请自行查找。)
string_buffers[0]= "5555555555555555";
此行用字符串“555555555555555”替换上面的指针。
dl.getuserdata(0,string_buffers,string_buffers2);
在这里,您将带有字符串的列表传递给函数,而函数则使用指向字节的指针。问题是你想在这里实现的,即你是否想要写入缓冲区。如果没有,请在C ++中使用const
,只需将"22222"
作为参数传递,ctypes会自动为您完成剩下的工作。
那说,可能是我猜错了,因为你还没有解释到底发生了什么(引用错误信息!)以及你究竟是怎么确定某些东西不起作用的。此外,您应该清理破坏的C ++代码,或者用更小的更适合解释确切问题的代码暂时替换它。