如何将python对象传递给需要指针类型的函数

时间:2014-06-30 07:30:58

标签: python c++ swig

我使用swig将一些C ++ Api包装到Python中。

c ++ api看起来像这样。

class CThostFtdcMdSpi
{
public:
virtual void OnFrontConnected(){};
virtual void OnFrontDisconnected(int nReason){};
virtual void OnHeartBeatWarning(int nTimeLapse){};
...
};

class MD_API_EXPORT CThostFtdcMdApi
{
public:
static CThostFtdcMdApi *CreateFtdcMdApi();
virtual void RegisterSpi(CThostFtdcMdSpi *pSpi) = 0;
...
}

MdSpi定义了一些回调函数行为。 MdApi需要调用RegisterSpi(CThostFtdcMdSpi * pSpi)来注册那些回调函数 这就是我想在python中使用它的方法

class Quote(CThostFtdcMdSpi):
def OnFrontConnected(self):
    pass

def OnFrontDisconnected(self, *args):
    pass

md = CThostFtdcMdApi_CreateFtdcMdApi()
q = Quote()
md.RegisterSpi(q)

Python提供了此错误消息:

def RegisterSpi(self, *args): return _MdApi.CThostFtdcMdApi_RegisterSpi(self, *args)
TypeError: in method 'CThostFtdcMdApi_RegisterSpi', argument 2 of type 'CThostFtdcMdSpi *'

这是我的MdApi.i。 MdApi和MdSpi都在ThostFtdcMdApi.h中定义

%module MdApi
%{
#include "ThostFtdcMdApi.h"
%}

%feature("director") CThostFtdcMdSpi;
%feature("director") CThostFtdcMdApi;

%include "ThostFtdcMdApi.h"

1 个答案:

答案 0 :(得分:0)

您似乎在模块级别缺少启用导向器。 .i文件的第一行必须是:

%module(directors="1") MdApi

来自directors documentation

  

默认情况下,导演功能处于禁用状态。要使用控制器,您必须对接口文件进行两处更改。首先,添加"导演" %module指令的选项,如下所示:

%module(directors="1") modulename
     

如果没有此选项,将不会生成任何导演代码。其次,您必须使用%feature("director")指令告诉SWIG哪些类和方法应该获得控制器。