如何用void *参数,%typemap包装函数

时间:2015-03-30 15:18:02

标签: c# c++ api swig

我必须扩展C ++ API(我的论文项目的Cinema 4D SDK)的包装,由学生团队用SWIG 3.0包装到c#。我无法更改任何API代码。

现在,我正在努力包装一个特定的功能。该函数在C ++ c4d_nodedata.h文件中定义如下:

virtual Bool Message(GeListNode* node, Int32 type, void* data);

如果我在SWIG .I文件中没有执行任何具体操作,则函数将包含在此:

public virtual bool Message(GeListNode node, int type, SWIGTYPE_p_void data) {
    bool ret = C4dApiPINVOKE.NodeData_Message(swigCPtr, GeListNode.getCPtr(node), type, SWIGTYPE_p_void.getCPtr(data));
    return ret;
}

此函数是API中消息传递系统的一部分,对于参数data,特定对象的调用类型为DocumentInfoData

public override bool Message(GeListNode node, int type, SWIGTYPE_p_void data)

所以在C ++中,它是一个基本的无效指针,我可以对我的DocumentInfoData类型对象进行投射,然后对此进行处理。在C#中我无法强制转换,因为SWIGTYPE_p_void中的所有方法都是私有的或标准内部的 - 所以没有getter等。

我现在尝试用swig中的%typemap包装它。 %typemap看起来像这样:

%typemap(ctype) void*, void*& "void* /* void* */" 
%typemap(in) void*  %{ $1 = (void*)$input; /* void*_in */%} 
%typemap(in) void*& %{ $1 = (void**)&$input;  /* void*&_in */%} 
%typemap(imtype, out="global::System.IntPtr") void*, void*& "DocumentInfoData /* DocumentInfoData_imtype */" 
%typemap(cstype, out="global::System.IntPtr") void*, void*& "DocumentInfoData /* DocumentInfoData_cstype */" 
%typemap(csin) void*, void*& "$csinput /* DocumentInfo_csin */"

这会将参数值包装为正确的DocumentInfoData类型。但是我的%typemaps覆盖了%typemap等其他方法的错误,例如,我们通常不会将void*强制转换为DocumentInfoData而是做一些不同的事情。

有没有办法只在某些特定功能上使用这样的SWIG %typemaps?我知道SWIG doc中的范围部分。但它似乎只适用于内联代码。

我也知道this的问题,但没有得到合适的答案。

0 个答案:

没有答案