关于python调用c++等dll心得说明

这篇博客详细介绍了在Python中如何使用ctypes库加载和调用DLL,包括stdcall和cdecl两种调用约定。作者解释了指针的概念,并通过示例展示了如何处理含有指针的函数调用,同时对这种面向过程的通信方式表达了个人看法。
摘要由CSDN通过智能技术生成

加载dll方式:

stdcall方式:
gbDll = WinDLL("./SajetConnect.dll")
gbDll = windll.LoadLibrary("./SajetConnect.dll")
# 补充
gbDll = OleDLL("./SajetConnect.dll") 
cdecl方式:
gbDll = cdll.LoadLibrary("./SajetConnect.dll")
gbDll = ctypes.CDLL("./SajetConnect.dll")
# 补充
gbDll = PyDLL("./SajetConnect.dll") 

没有指针就根调用普通方法一样

例如:

gbDLL.start(参数1,参数2...)

有指针可以这样做:

先说明指针的意思:例如python在内存中开辟一片空间,此时python通过引用就能找到那片空间,此时将引用交给c++等,c++通过这个引用修改python开辟的那片空间里面的值。这很low,都面向对象的年代了,还面向过程,害。

所以你要拿到c++返回的结果,第一个结果是他方法返回的结果,第二个实际上一般你还是拿python开辟那片空间的值。又想吐槽一波,我给你数据,你告诉我数据,咋各做各的事情,修改同一片空间的值有意思吗?

 

demo:

 # 这里直接点调用方法
 func = gbDll.SajetTransData
 # 传入参数为字符指针 第一个参数是个固定值,第二个参数是字符串指针,第三个参数是int类型的指针
 func.argtypes = [c_int, c_char_p, POINTER(c_int)]
 # 返回值类型
 func.restype = c_bool  # 这里不知道什么类型我下面给个网址,你自己查查
 # 字符串缓冲区
 f_data_buffer = create_string_buffer(1024, f_data)
 # 方法调用
 res = func(cmd, f_data_buffer, c_int(len(f_data)))

 # 注意!!! 一般你要得到他修改f_data_buffer里面的值
   
 # 这样就可以得到了
 # repr(f_data_buffer.raw)

  ctypes参考网址:

 

  https://docs.python.org/zh-cn/3.9/library/ctypes.html

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值