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

How to access C++ Namespaces and Classes with Python ctypes

本文关键字:命名空间 c++ 访问 何使用 Python ctypes      更新时间:2023-10-16

我有一个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);

I try this without success:

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。

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