python调用dll详解

参考连接http://www.javashuo.com/article/p-xigefrbw-he.htmlhtml

https://www.jb51.net/article/52513.htmpython

http://www.javashuo.com/article/p-kwdxpobn-ha.htmlwindows

windows安装MinGW-w64教程http://www.javashuo.com/article/p-fgvxdval-q.htmlide


公司业务须要,让我用python调用领导写好的dll库,通过一段时间的研究,终于调用成功,特此来记录一下过程ui

开发环境win10+python3.6.8(64位)spa


1.安装MinGW-w64

安装这个的目的是生成dll文件用,参考地址在上面,讲一下注意的点。.net

  1. 安装的时候version选择最新的便可。
  2. 安装目录随便选,不是C盘也能够.
  3. 在这一步下载的时候,大概是20分钟左右,若是以为慢的话,能够直接去下载源码而后解压便可,参考文章里的8、问题列表里有说明
  4. 安装好记得在命令行里面验证一下是否正确安装

2.编写文件生成dll

#include <stdio.h>
 
extern "C" {
    __declspec(dllexport) int Double(int x);
    __declspec(dllexport) float floatAdd(float a,float b); 
    __declspec(dllexport) void HelloWorld(char * str); 
    __declspec(dllexport) void Ints(int * arr,int n); 
}
 
int Double(int x){
    return x*2;
}

float floatAdd(float a,float b) {
    return a+b;
}

void HelloWorld(char * str){
    puts(str);
}

void Ints(int * arr,int n){
    for(int i=0;i<n;i++){
        printf("%d ",arr[i]);
    }
    puts("");
}
View Code

生成dll命令行

g++ dlltest.cpp -shared -o dlltest.dll

3.python调用dll

from ctypes import *


dll = windll.LoadLibrary('E:\code\lx_code\dlltest.dll')

print(dll)

a=dll.Double(123)
print(type(a))
print(a)

输出内容code

<WinDLL 'E:\code\lx_code\dlltest.dll', handle 6c100000 at 0x27f2ab8bc88>
<class 'int'>
246

到这里,就算调用成功了。htm

4.可能会遇到的问题

ctypes库加载dll有好几种方式,你能够本身尝试一下用哪种方式,参考网址https://www.cnblogs.com/baihuitestsoftware/articles/5345089.html

stdcall调用约定:两种加载方式

Objdll = ctypes.windll.LoadLibrary("dllpath")
Objdll = ctypes.WinDLL("dllpath")

cdecl调用约定:也有两种加载方式

Objdll = ctypes.cdll.LoadLibrary("dllpath")  
Objdll = ctypes.CDLL("dllpath")  
# 其实windll和cdll分别是WinDLL类和CDll类的对象。
相关文章
相关标签/搜索