1. 加载动态连接库

  1. c_long的大小和平台有关:(32)位。python

  2. 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

__cdecl

32bit和16bit的约束相同,参数从右往左进栈(这样第一个参数就是栈顶元素),调用者清理参数。方法名前定义 _ 如 int Double(int a,int b){return a*b;}这里默认是__cdecl,经过在前加修饰符 _ 表示调用约定为 __cdeclblog

__stdcall

win32程序,除了可变参数函数外(可变函数遵循的是 __cdecl标准)以及一些使用 __fastcall的函数。 参数从右往左进栈,被调用者清理栈。方法名修饰 _funcname@n (n表示参数占用的字节)get

__fastcall

前两个参数被存入ECX和EDX寄存器中,其他的和__stdcall同样从右往左进栈。而后调用者清理栈。方法名经过@funcname@n(n表示参数占用字节,包括ECX和EDX中的)编译器

thiscall

第一个参数this被放入ECX寄存器中,其他的按照__stdcall约定从右往左进栈。即,被调用者清理栈, 方法名由C++编译器经过额外的复杂的一种机制进行装饰。这种是很是有必要的,由于C++方法重载,因此须要复杂的装饰来进行知足不一样的重载有不一样的方法名。

声明和定义的约定必定要相同。

相关文章
相关标签/搜索