加载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