3

我想从 Python 访问闭源 DLL 中的一个类,用 Visual C++ 编译。我没有头文件,只有目标代码,没有接口描述。

我可以使用 加载 DLL ctypes.CDLL,但任何调用函数的尝试都会导致访问冲突。显然 ctypes 不知道__thiscall调用约定(它不是为 C++ 设计的)。通常,我会简单地编写一个扩展模块,但没有源代码我在这里不走运。

这是 MSDN 所说的:

__thiscall 调用约定用于成员函数,是不使用变量参数的 C++ 成员函数使用的默认调用约定。在 __thiscall 下,被调用者清理堆栈,这对于 vararg 函数是不可能的。在 x86 架构上,参数从右到左压入堆栈,this 指针通过寄存器 ECX 传递,而不是在堆栈上。

例如,这是导出的函数签名的外观(未损坏):

public: __thiscall CFoo::CFoo(void)

我尝试从 Python 访问构造函数:

getattr(dll, "??0CFoo@@QAE@XZ")(c_voidp())

这不起作用,因为 ctypes 没有传递实例指针,而我得到的只是访问冲突。

我想我不能轻易做到这一点,因为 ctypes 没有 C++ 支持,而且每个编译器都有自己的名称修改约定,因此很难以通用方式实现它。__thiscall调用约定不是由 ctypes 实现的。

显而易见的解决方法是使用 Visual C++ 编写的包装器,它将函数导出为__stdcall,但我不想依赖它。

正确的?还是我错过了什么技巧?

4

0 回答 0