在swig.i文件中,如何为基于mfc的第三方dll解析ms-windows-vc++typedef类型
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 );
类的构造函数
首次尝试
我以为这是因为swig把VOID作为一个复杂的结构。我将.h文件中的VOID
更改为void
。但是在"成功"编译之后,python无法导入模块。因为函数声明与SDK DLL中的声明不同。
CCD_ 6也出现了同样的问题。
cannot convert from 'char **' to 'LPCSTR *'
PS我已将%include <windows.i>
添加到.I文件中。但是swig仍然将VOID
作为一个复杂的结构。
问题
如何为这种typedef编写一个right.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; }
-
我以前试过这种蹄子。导入还可以,但当我调用一个函数时,它引发了一个异常。
exception: access violation writing 0x1D1A9446
我认为这是因为这是一个C++多工函数。代码想要访问一个类成员变体,该变体超出了函数的范围。这就是ctypes不适用于c++类dll的原因。
SDK
SDK提供了15个.h文件、17个.dll文件和4个.lib文件。它同时支持unicode和多字节代码。它使用了许多LPCSTR和其他与字符串相关的typedef。
不确定VOID
的问题是什么,需要查看更多代码(例如,VOID
定义为什么)。
关于LPCSTR
,确实不能转换。一种方法是将C++LPCTSTR上解释的内容放入.i中的包装函数中的char*。它是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);
}
%}
我还没有测试过以上内容,这是我基于SO帖子的最佳猜测,所以你可能需要修正一些,但你已经明白了。SWIG的%inline
和%extend
指令允许您将一个API完全调整为另一个(在本例中,将一个以char**作为arg的函数更改为一个返回字符串的函数)。
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- C++ MFC Libraries in Travis CI
- 如何包装第三方DLL在R中使用
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 从 bmp 文件数据创建 MFC CBitmap
- 第三方 API 中的编译错误 - Visual Studio
- 如何在 MFC 中显示文件的所有行
- 目录删除 MFC 的问题
- 在一个解决方案中针对第三方静态库 (Creo) 的不同版本(版本)进行构建
- MFC:如何设置CEdit框的焦点?
- MFC 中的抗锯齿
- 双击更改 mfc 中列表控件中的行的颜色
- C++MFC编辑框处理双击
- C++ MFC CObject 派生类摘要?
- 如何在 MFC 对话框中使用 OnDraw
- 在 1 个服务器 n 客户端套接字 C++ MFC 应用程序中更新数据的客户端
- MFC:你能在CDateTimeCtrl中改变自旋的加速度吗?
- MFC:我们如何轻松地从CTreeCtrl切换到CTreeView?
- 在swig.i文件中,如何为基于mfc的第三方dll解析ms-windows-vc++typedef类型
- 在没有第三方工具/项目的情况下,在 MFC C++发布版本中查找内存泄漏