使用SWIG

时间:2019-01-02 21:56:35

标签: python python-3.x swig variant

我正在尝试使用SWIG包装一种“变体”类型。我的意思是有点像GType之类的东西,您所获得的指针是基本类型,但实际类型实际上更大,可以使用基本类型的字段来找到它。

#define OBJ_TYPE_1 1
#define OBJ_TYPE_2 2

typedef struct Base_t {
    DWORD mObjectSize;
    DWORD mObjectType;
} Base;

typedef struct Object1_t {
    Base mBase;
    DWORD member1;
    DWORD member2;
    // Some specific members...
} Object1;

typedef struct Object2_t {
    Base mBase;
    DWORD member3;
    DWORD member4;
     WORD member5;
    // Some different specific members ...
} Object2;

建议的C接口使用库的方式类似于以下内容

Base base;

// Get object header to find out type
PeekObject(&base);

// Treat object depending on type
if (base.mObjectType == OBJ_TYPE_1) {
    Object1* obj = (Object1*) malloc(sizeof(Object1));
    ReadObject(&(obj->mBase));
    DWORD blahblah = obj->member2;
}
else if (base.mObjectType == OBJ_TYPE_2) {
    // ...
}

您如何将其包装在SWIG中?理想情况下,在Python中,您只需“ ReadObject” 即可直接接收正确类型的对象。

>>> obj = lib.read_object()
>>> obj
<class 'lib.Object1'>

我不能更改库,但是可以修改包装(.i文件)。我应该使用自定义代码吗?我应该使用类型映射吗?我不知道为什么,我记得SWIG文档中有专门针对此的示例,但是我无法再次找到它……

0 个答案:

没有答案