zoukankan      html  css  js  c++  java
  • python调用dll详解

    参考链接https://www.cnblogs.com/TQCAI/p/8881530.html

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

    https://www.cnblogs.com/pyse/p/8590829.html

    windows安装MinGW-w64教程https://www.cnblogs.com/ggg-327931457/p/9694516.html


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

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


    1.安装MinGW-w64

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

    1. 安装的时候version选择最新的即可。
    2. 安装目录随便选,不是C盘也可以.
    3. 在这一步下载的时候,大概是20分钟左右,如果觉得慢的话,可以直接去下载源码然后解压即可,参考文章里的八、问题列表里有说明
    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:codelx_codedlltest.dll')
    
    print(dll)
    
    a=dll.Double(123)
    print(type(a))
    print(a)

    输出内容

    <WinDLL 'E:codelx_codedlltest.dll', handle 6c100000 at 0x27f2ab8bc88>
    <class 'int'>
    246

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

    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类的对象。
  • 相关阅读:
    python RabbitMQ队列/redis
    python 协程
    Python 线程
    Python Socket网络编程
    Python 面向对象编程进阶
    Python 面向对象
    python 模块
    Python 迭代器&生成器&装饰器
    Python 集合操作
    Java多态--构造方法的内部方法多态
  • 原文地址:https://www.cnblogs.com/blog-rui/p/11662827.html
Copyright © 2011-2022 走看看