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])