从Python访问Visual C ++ DLL(__thiscall调用约定)

时间:2012-08-07 20:59:17

标签: python ctypes

我想从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,但我不想依赖它。

正确?或者有没有我错过的技巧?

0 个答案:

没有答案