Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中使用ctypes与仅包含函数指针的c结构交互_Python_Ctypes - Fatal编程技术网

在python中使用ctypes与仅包含函数指针的c结构交互

在python中使用ctypes与仅包含函数指针的c结构交互,python,ctypes,Python,Ctypes,我在dll中有一个结构,它只包含我想在python中与之交互的函数指针(即vtable)(出于测试目的)。我在使用ctypes解决这个问题时遇到了一些困难 我得到的是: struct ITest { virtual char const *__cdecl GetName() = 0; virtual void __cdecl SetName(char const *name) = 0; }; /* Factory function to create 're

我在dll中有一个结构,它只包含我想在python中与之交互的函数指针(即vtable)(出于测试目的)。我在使用ctypes解决这个问题时遇到了一些困难

我得到的是:

struct ITest  
{  
    virtual char const  *__cdecl GetName() = 0;  
    virtual void  __cdecl SetName(char const *name) = 0;  
};

/* Factory function to create 'real' Test object */  
extern "C" __declspec(dllexport) struct ITest * CALLCONV make_Test(char const * name); 
“真实”测试对象将根据需要填充结构。这将被编译成一个DLL(test.DLL)。在python中,我希望能够调用factory方法来获取指向测试结构的指针,然后调用结构中包含的函数指针,但我似乎无法理解如何使用ctypes。有没有人有做类似事情的指针/例子,或者我应该使用SWIG或Boost之类的东西


谢谢您的帮助。

ctypes文档说明您可以从地址创建ctypes.PYFUNCTYPE

如果您获得了结构中函数的地址,那么您可以使用ctypes.PYFUNCTYPE将其包装为Python函数,然后将其作为常规ctype函数调用

我并没有亲自测试,但我认为在你的案例中,这可能是需要探索的


我希望这会有所帮助。

ctypes文档中说,您可以从地址创建ctypes.PYFUNCTYPE

如果您获得了结构中函数的地址,那么您可以使用ctypes.PYFUNCTYPE将其包装为Python函数,然后将其作为常规ctype函数调用

我并没有亲自测试,但我认为在你的案例中,这可能是需要探索的


我希望它有帮助

像这样的东西应该是一个很好的起点(我没有编译你的DLL来测试)

在此之后,您需要调用make_Test()来获取结构,并尝试调用函数。也许有这样的代码:

itest = test.make_Test().contents
itest.SetName('asdf')
print itest.GetName()

提供dll或测试,并给我您的结果,如果您仍然有问题,我可以提供更多帮助。

类似的内容应该是一个很好的起点(我没有编译您的dll以进行测试)

在此之后,您需要调用make_Test()来获取结构,并尝试调用函数。也许有这样的代码:

itest = test.make_Test().contents
itest.SetName('asdf')
print itest.GetName()
提供dll或测试,并给我你的结果,我可以帮助更多,如果你仍然有问题