1. 加载动态链接库
2019-11-22 18:46
169 查看
-
c_long
的大小和平台有关:(32)位。 -
64位
编译出来的dll
如果和python
的版本不一样,那么就会出现下面的错误
当前是64
的,所以修改了之后就可以了。
#include<stdio.h> extern "C" void show() { printf("hello"); }
from ctypes import * handle = WinDLL("./test.dll") handle.show()
也可以使用LoadLibrary
,进行加载。
加载方式而造成调用方式不同。 此文章针对windows环境
如果成员方法使用了调用协议,那么就会有一个this指针作为隐式的第一个参数。
调用约定,32bit x86保护 edi,esi,ebp,ebx寄存器,使用fdx,eax对来处理返回值
__cdecl
32bit和16bit的约束相同,参数从右往左进栈(这样第一个参数就是栈顶元素),调用者清理参数。方法名前定义 _ 如 int Double(int a,int b){return a*b;}这里默认是__cdecl,通过在前加修饰符 _ 表示调用约定为 __cdecl
__stdcall
win32程序,除了可变参数函数外(可变函数遵循的是 __cdecl标准)以及一些使用 __fastcall的函数。 参数从右往左进栈,被调用者清理栈。方法名修饰 _funcname@n (n表示参数占用的字节)
__fastcall
前两个参数被存入ECX和EDX寄存器中,其余的和__stdcall一样从右往左进栈。然后调用者清理栈。方法名通过@funcname@n(n表示参数占用字节,包括ECX和EDX中的)
thiscall
第一个参数this被放入ECX寄存器中,其余的按照__stdcall约定从右往左进栈。即,被调用者清理栈, 方法名由C++编译器通过额外的复杂的一种机制进行装饰。这种是非常有必要的,因为C++方法重载,所以需要复杂的装饰来进行满足不同的重载有不同的方法名。
声明和定义的约定一定要相同。
相关文章推荐
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 动态链接库加载函数的两种方法及区别
- 静态链接库、动态链接库和动态加载库
- 动态监控驱动sys、动态链接库dll、可执行文件exe加载
- dlopen dlsym dlclose加载动态链接库
- C#总结(七)动态加载C++动态链接库
- VC++中动态链接库的显示加载和隐式加载的区别
- 加载动态链接库的方法
- Centos加载动态链接库
- linux动态加载动态链接库
- libevent-1.4.so.2动态链接库加载失败
- 主程序加载动态链接库(类方法)(动态加载)
- windows服务器下IIS6/7下PHP 无法加载 php_curl.dll 等动态链接库
- 静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。
- 动态链接库的显示加载和隐式加载的区别
- 多平台加载动态链接库总结
- 动态链接库dll的两种加载方式
- 采用dlopen、dlsym、dlclose加载动态链接库
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】