一,准备
参考网址:Python调用DLL动态链接库——ctypes使用 - 蛋片鸡 - 博客园。
重点,python3是64位的,所以VS生成的dll要选择64位的。
二、DLL的头文件和源文件
C头文件
// MakeDll.h
#ifndef _MAKE_DLL_H_
#define _MAKE_DLL_H_
#define DLL_IMPLEMENT
#ifdef DLL_IMPLEMENT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C"
{
#endif
DLL_API int mytest(int a, int b);
DLL_API int GetAlgVersion(char **pstr);
DLL_API int mytest2(unsigned char *pSrc, int n, unsigned char *pDst);
#ifdef __cplusplus
}
#endif
#endif
C的源码
// MakeDll.c
#include "MakeDll.h"
#include <string.h>
#include <stdio.h>
#define ALG_VERSION_LEN 40
#define ALG_VERSION ("2020 2020 3030")
char gc_AlgVersion[ALG_VERSION_LEN] = ALG_VERSION;
char gc_AlgVersion2[ALG_VERSION_LEN] = {0};
DLL_API int mytest(int a, int b)
{
int c = 20 + 20;
c = c + a;
c = c + a;
return a + b + 100;
}
DLL_API int GetAlgVersion(char **pstr)
{
int n = strlen(gc_AlgVersion);
memcpy(gc_AlgVersion2, ALG_VERSION, ALG_VERSION_LEN);
*pstr = gc_AlgVersion2;
return n;
}
DLL_API int mytest2(unsigned char *pSrc, int n, unsigned char *pDst)
{
int i = 0;
for (i = 0; i < n; ++i)
{
pDst[i] = pSrc[i] + 10;
}
return 1;
}
三 Python的调用
# -*- coding: utf-8 -*-
from ctypes import *
import numpy as np
dll = CDLL("MakeDll.dll")
#%%
x = dll.mytest(3,4)
print(x)
#%%
mytest22 = dll.mytest2
mytest22.argtypes = [np.ctypeslib.ndpointer(dtype=np.uint8,ndim=1,flags = "C_CONTIGUOUS"), c_int,
np.ctypeslib.ndpointer(dtype=np.uint8,ndim=1,flags = "C_CONTIGUOUS")]
t1 = np.ones(5,dtype = 'uint8')
t2 = np.zeros(5,dtype = 'uint8')
mytest22(t1,4,t2)
print(t1)
print(t2)
#%%
GetAlgVersion = dll.GetAlgVersion
backends = []
backends_c = POINTER(c_char)()
n = GetAlgVersion(byref(backends_c))
for i in range(n):
backends.append(backends_c[i].decode('utf-8'))
s = ''.join(backends)
print(s)
参考资料:
Python调用DLL动态链接库——ctypes使用 - 蛋片鸡 - 博客园 (首先看)
Python与C交互之指针_Kelvin_Yan的专栏-CSDN博客
Python使用ctypes模块调用DLL函数之C语言数组与numpy数组传递 (排版不好,但实用)
Python调用C++函数(SWIG,VS2013使用numpy.i完成Numpy与C++数组转换)_ustczhang的博客-CSDN博客
使用 ctypes 进行 Python 和 C 的混合编程 - Anonymous596 - 博客园