c_long
的大小和平台有关:(32)位。python
64位windows
编译出来的dll
若是和python
的版本不同,那么就会出现下面的错误函数
当前是64
的,因此修改了以后就能够了。this
#include<stdio.h> extern "C" void show() { printf("hello"); }
from ctypes import * handle = WinDLL("./test.dll") handle.show()
LoadLibrary
,进行加载。加载方式而形成调用方式不一样。 此文章针对windows环境.net
若是成员方法使用了调用协议,那么就会有一个this指针做为隐式的第一个参数。指针
调用约定,32bit x86保护 edi,esi,ebp,ebx寄存器,使用fdx,eax对来处理返回值code
32bit和16bit的约束相同,参数从右往左进栈(这样第一个参数就是栈顶元素),调用者清理参数。方法名前定义 _ 如 int Double(int a,int b){return a*b;}这里默认是__cdecl,经过在前加修饰符 _ 表示调用约定为 __cdeclblog
win32程序,除了可变参数函数外(可变函数遵循的是 __cdecl标准)以及一些使用 __fastcall的函数。 参数从右往左进栈,被调用者清理栈。方法名修饰 _funcname@n (n表示参数占用的字节)get
前两个参数被存入ECX和EDX寄存器中,其他的和__stdcall同样从右往左进栈。而后调用者清理栈。方法名经过@funcname@n(n表示参数占用字节,包括ECX和EDX中的)编译器
第一个参数this被放入ECX寄存器中,其他的按照__stdcall约定从右往左进栈。即,被调用者清理栈, 方法名由C++编译器经过额外的复杂的一种机制进行装饰。这种是很是有必要的,由于C++方法重载,因此须要复杂的装饰来进行知足不一样的重载有不一样的方法名。
声明和定义的约定必定要相同。