【发布时间】:2014-03-31 21:49:50
【问题描述】:
我想用 swig 将基于 MFC C++ 的 SDK 包装到 python 模块中。但在这里我认为问题只涉及 C++ 和 swig。
问题
编译.i文件后,我开始编译xxx_wrap.cxx时,报错了。
error C2182: 'arg1' : illegal use of type 'void'
在cxx文件中,错误码是这个VOID arg1 ;。
在原始 .h 文件中,错误代码是类 XXXxxx( VOID ); 的构造函数
第一次尝试
我认为这是因为 swig 将 VOID 视为一个复杂的结构。我将 .h 文件中的 VOID 更改为 void。但是在“成功”编译后,python 无法导入模块。因为函数声明与 SDK DLL 中的不一样。
同样的问题也发生在LPCSTR。
cannot convert from 'char **' to 'LPCSTR *'
附言
我已将%include <windows.i> 添加到 .i 文件中。但 swig 仍然把 VOID 作为一个复杂的结构。
问题
如何为这种typedef编写正确的.i文件?还有其他包装代码示例吗?我搜索了stackoverflow和github,但一无所获。
可能的解决方案
也许我应该在 .i 之外的 %{ ... }% 部分中为 swig 编写 typedef,而不仅仅是在 .h 文件中。但我不知道怎么做。我目前正在第三次阅读 swig 文档。
限制
- DLL 文件作为设备 SDK 提供,我没有源文件。
-
从 .h 文件中,我们知道 DLL 是基于多个类的。
class A; class B; class C; class __declspec(dllexport) D { ... private: friend class A; friend class B; friend class C; } -
我以前尝试过 ctypes。导入没问题,但是当我调用一个函数时,它引发了异常。
exception: access violation writing 0x1D1A9446我认为这是因为这是一个 C++ 的数组函数。代码想要访问超出函数范围的类成员变体。这就是 ctypes 不适用于 c++ 类 dll 的原因。
SDK
SDK 提供 15 个 .h 文件、17 个 .dll 文件和 4 个 .lib 文件。它同时支持 unicode 和多字节代码。它使用了很多 LPCSTR 和其他与字符串相关的类型定义。
【问题讨论】: