如何使用Python ctypes访问C ++命名空间和类

时间:2014-08-03 15:51:04

标签: python c++ ctypes

我有一个带有以下命名空间和类的C ++库:

namespace avdecc_lib
{
    class net_interface;
    class controller;

    class system
    {
      public:
         enum system_type
         {
            LAYER2_MULTITHREADED_CALLBACK,
         };
    }
    extern "C" AVDECC_CONTROLLER_LIB32_API system * STDCALL create_system(system::system_type type, net_interface *netif, controller *controller_obj);

我想在Python中使用ctypes进行以下调用:

sys = avdecc_lib::create_system(avdecc_lib::system::LAYER2_MULTITHREADED_CALLBACK, netif, controller_obj);

我尝试了这个没有成功:

self.avdecc_lib = cdll.LoadLibrary("path/to/lib.so")
self.sys = self.avdecc_lib.create_system(self.avdecc_lib.system.LAYER2_MULTITHREADED_CALLBACK,self.netif,self.controller_obj)

加载库并成功生成对象,但我没有指出函数调用出了什么问题。

如何访问avdecc_lib::system::LAYER2_MULTITHREADED_CALLBACK

1 个答案:

答案 0 :(得分:0)

枚举常量不会从库中导出,因此无法在运行时找到它们。您唯一的选择是根据标题确定数值。如果常量没有明确赋值,则它比前一个常量多一个,如果它是枚举中的第一个常量,则为0。

顺便说一句,你的函数已经用STDCALL调用约定声明,但cdll使用CDECL调用约定。您需要使用windll来正确调用该函数。