![](/img/trans.png)
[英]How do I use the correct dll files to enable 3rd party C libraries in a Cython C extension?
[英]In a swig .i file, how to resolve ms windows vc++ typedef type for 3rd party mfc based dll?
我想用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 );
类的构造函数XXXxxx( VOID );
第一次尝试
我认为这是因为swig将VOID视为一个复杂的结构。 我将.h文件中的VOID
更改为void
。 但是在“成功”编译之后,python无法导入模块。 因为函数声明与SDK DLL中的函数声明不同。
在LPCSTR
发生了同样的问题。
cannot convert from 'char **' to 'LPCSTR *'
PS我已将%include <windows.i>
到.i文件中。 但是,仍然以VOID
为复杂结构。
题
如何为这种typedef编写正确的.i文件? 还有其他包装代码示例吗? 我搜索了stackoverflow和github,但一无所获。
可能的解决方案
也许我应该在%{ ... }%
部分之外的.i中为swig编写typedef,而不仅仅是在.h文件中。 但是我不知道如何。 我目前正在第三次阅读Swig文档。
限制
从.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 ++的mumber函数。 该代码想要访问一个类成员变量,该变量超出了函数的范围。 这就是为什么ctypes不适用于c ++类dll。
SDK
该SDK提供了15个.h文件,17个.dll文件和4个.lib fils。 它支持unicode和多字节代码。 它使用很多LPCSTR和其他与字符串相关的typedef。
不确定VOID
是什么问题,需要查看更多代码(例如VOID
定义为什么)。
关于LPCSTR
,确实不能转换。 一种实现方法是将C ++ LPCTSTR上解释的内容放在char *中的.i包装函数中。 它是char**
的事实表明C ++函数可能会返回一个指向内部字符串的指针。 Python不知道该如何处理,因此您应该返回一个字符串实例。 例:
%inline %{
std::string myFunc() // don't use char** since
{
LPCTSTR pszA = ... create buffer for LPCSTR string
callYourMFCFunc(& pszA);
CStringA sB(pszA);
return std::string((const char*)sB);
}
%}
我还没有测试过上面的内容,这是基于该帖子的最佳猜测,因此您可能需要解决一些问题,但是您知道了。 SWIG的%inline
和%extend
指令使您可以完全使一个API适应另一个API(在这种情况下,将以char **作为arg的函数更改为返回字符串的函数)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.