我想从Python中访问一个闭源DLL中的类,用Visual C ++编译。 我没有头文件,只有目标代码,没有接口描述。
我可以使用ctypes.CDLL
加载DLL,但任何调用函数的尝试都会导致访问冲突。显然ctypes不知道__thiscall
调用约定(它不是为C ++设计的)。通常,我只是编写一个扩展模块,但没有源代码,我在这里运气不好。
这就是MSDN所说的:
__ thiscall调用约定用于成员函数,而且是 这样做的C ++成员函数使用的默认调用约定 不要使用变量参数。在__thiscall下,被调用者清理 堆栈,这对vararg函数来说是不可能的。争论被推了 在堆栈中从右到左,这个指针被传递 通过寄存器ECX,而不是堆栈,在x86架构上。
例如,这是导出的函数签名的外观(未解码):
public: __thiscall CFoo::CFoo(void)
我尝试从Python访问构造函数:
getattr(dll, "??0CFoo@@QAE@XZ")(c_voidp())
这不起作用,因为ctypes没有传递实例指针,而我得到的只是访问冲突。
我想我不能轻易做到这一点,因为ctypes没有C ++支持,并且由于每个编译器都有自己的名称修改约定,因此很难以通用的方式实现它。 ctypes没有实现__thiscall
调用约定。
明显的解决方法是使用Visual C ++编写的包装器,它将函数导出为__stdcall
,但我不想依赖它。
正确?或者有没有我错过的技巧?