java如何加载动态链接库_1. 加载动态链接库

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

8f70827f351c496859e913b5d0bcc756.png

64位

71daba10e6418e8e75f2b8901d01144d.png

编译出来的dll如果和python的版本不一样,那么就会出现下面的错误

bd5d0fe93ab4b90262855352e7441c3f.png

当前是64的,所以修改了之后就可以了。

#include

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++方法重载,所以需要复杂的装饰来进行满足不同的重载有不同的方法名。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值