繁体   English   中英

在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 );类的构造函数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文档。

限制

  • 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 ++的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM