在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?

本文关键字:mfc 第三方 dll 类型 ms-windows-vc++typedef 解析 文件 swig      更新时间:2023-10-16

我想用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的函数更改为一个返回字符串的函数)。