Python调用C语言DLL

Python调用C语言DLL

1. 加载DLL

from ctypes import *
import  os
import platform
import time
#print (os.getcwd()) #获取当前工作目录路径
#print (os.path.abspath('.')) #获取当前工作目录路径
#print (os.path.abspath('test.txt')) #获取当前目录文件下的工作目录路径
#print (os.path.abspath('..')) #获取当前工作的父目录 !注意是父目录路径
#print (os.path.abspath(os.curdir)) #获取当前工作目录路径

#加载DLL
def DLLInit():
    DLL = cdll.LoadLibrary(os.path.abspath('Test_DLL.dll'))    
    return DLL
    
DLL = DLLInit()

2. 一维数组传递

a.字符串方式

因为使用的是Python3.8.2。所以在传递字符串时要加encode(’ascii’),否则只有第一个字节有效

DLL.Test_AddNet(“192.168.0.2”,8000)
‘192’被编码为49 0 57 0 50 0 ,即IP_addr[0]=‘1’、IP_addr[1]=’\0’、IP_addr[2]=‘9’……,所以只有第一个字节有效

#c-->>bool Test_AddNet(IN const char *IP_addr,IN short Port);
def AddNet(IP_addr,Port=1):    
    Ret=DLL.Test_AddNet(IP_addr.encode('ascii'),Port)#python3,是unicode编码
    return Ret

b.数组方式

#c-->>bool Test_AskStatus(IN const char *szDevPath,OUT DWORD *pdwChannelStatus);
def AskStatus(szDevPath,pdwChannelStatus):
    Ret=DLL.Test_AskStatus(szDevPath,pdwChannelStatus)
    return Ret

IntArray3Col = c_int * 8
dwChStatus=IntArray3Col()
Ret=AskStatus(Dev_List[0],dwChStatus)
print("CH1\tCH2\tCH3\tCH4\tCH5\tCH6\tCH7\tCH8 \n",
'0x%x'%dwChStatus[0], 
'\t0x%x'%dwChStatus[1],
'\t0x%x'%dwChStatus[2],
'\t0x%x'%dwChStatus[3],
'\t0x%x'%dwChStatus[4],
'\t0x%x'%dwChStatus[5],
'\t0x%x'%dwChStatus[6],
'\t0x%x'%dwChStatus[7])

3. 二维数组传递

#c-->>DWORD Test_GetDeviceList(OUT char Dev_List[][256]);
def GetDeviceList(Dev_List):    
    Ret=DLL.Test_GetDeviceList(Dev_List)    
    return Ret

IntArray256Col = c_char * 256
IntArray8Row256Col = IntArray256Col * 8
Dev_List = IntArray8Row256Col(IntArray256Col())

Ret=DLL.Test_GetDeviceList(Dev_List)
print("Dev_Num",Ret)
print("Dev_List 1",Dev_List[0])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值