【问题标题】:In a swig .i file, how to resolve ms windows vc++ typedef type for 3rd party mfc based dll?在 swig .i 文件中,如何为基于 3rd 方 mfc 的 dll 解析 ms windows vc++ typedef 类型?
【发布时间】: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 和其他与字符串相关的类型定义。

【问题讨论】:

    标签: python c++ dll mfc swig


    【解决方案1】:

    不确定VOID 的问题是什么,需要查看更多代码(例如,VOID 定义为什么)。

    关于LPCSTR,确实不能转换。一种方法是将C++ LPCTSTR to 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);
        }
    %}
    

    我没有测试上述内容,这是我根据那篇 SO 帖子的最佳猜测,因此您可能需要修复一些问题,但您明白了。 SWIG 的 %inline 和 %extend 指令允许您将一个 API 完全适应另一个 API(在这种情况下,将采用 char** 作为 arg 的函数更改为返回字符串的函数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多