精华内容
下载资源
问答
  • 1.python调用dll,必须客观根据dll原文件中声明的对应方式调用; 每个函数的入参和出参类型必须客观的根据原函数的入参和出参类型进行设置转化; 如果不清楚原函数出入参的类型,就不要谈python调用dll文件啦; ...

    #coding=utf-8

    #直接将代码放在 Pycharm中挨着看就明白:

    """总结:

    1.python调用dll,必须客观根据dll原文件中声明的对应方式调用;

    1. 每个函数的入参和出参类型必须客观的根据原函数的入参和出参类型进行设置转化;
    2. 如果不清楚原函数出入参的类型,就不要谈python调用dll文件啦;
    3. 这里代码只是简单例子,没有涉及C++类,没有涉及dll文件中引用dll文件;
    4. 后面有很多参考文章,很不错的!

    """


    import ctypes
    from ctypes import *

    """第一步:加载dll文件(window系统是dll文件,Linux系统是.og格式文件)
       C语言中的函数默认是__cdecl调用,C++中可用__stdcall来显示声明调用,但也可以用extern “C”
       用python调用dll时需要根据不同的调用约定而使用不同的函数。但是不管什么调用,最后都必须用
       extern “C”来防止名字粉碎。
       目前ctypes下有两种方式加载,具体选择哪一种方式要根据dll源码里头文件即extern "C"
       {....}部分中声明的调用格式去调用选择加载方式:

    常见:
    __cdecl、、、---------对应用ctypes.CDLL(或cdll.LoadLibrary)
    __stdcall、、、-------对应用ctypes.WinDll(或ctypes.windll.LoadLibrary)
    """

    """第一种加载方式"""
    #dll=ctypes.CDLL('C:\\Users\\Administrator\\Desktop\\depends22_x86\\libtestdll.dll')
    dll=cdll.LoadLibrary('C:\\Users\\Administrator\\Desktop\\depends22_x86\\libtestdll.dll')
    #dll=ctypes.windll.LoadLibrary('C:\\Users\\Administrator\\Desktop\\depends22_x86\\libtestdll.dll')
    #cdll.LoadLibrary和ctypes.CDLL效果一样
    """第二种加载方式"""
    # dll = ctypes.windll.LoadLibrary( 'test.dll' )
    # dll = ctypes.WinDll( 'test.dll' )
    ###其中ctypes.windll为ctypes.WinDll类的一个对象,已经在ctypes模块中定义好的。
    #############################1---int整型(如果不加任何修饰,默认传入参数为int,传出参数也为int)#############
    Double=dll.Double   #加载函数对象
    Double.argtypes=[c_int]    #设置该函数入参类型,入参用[arg1,arg2,....]
    #入参是int型或返回值是整型可不用进行设置(修饰)
    print "int:",Double(4)
    #上面三行和下面一行同样的效果
    print "int:",dll.Double(c_int(4))

    ############################2---float型数据############################
    floatAdd=dll.floatAdd      #加载函数对象
    floatAdd.argtypes=[c_float,c_float]   #设置该函数入参类型,入参用[arg1,arg2,....]或(arg1,arg2,...)
    floatAdd.restype=c_float              #这是该函数返回值类型
    print floatAdd(1.4,3.45)
    #上面四行和和下面两行一样
    dll.floatAdd.restype=c_float
    print dll.floatAdd(c_float(1.4),c_float(3.5))#注意由于返回值是float型,就必须先用floatAdd.restype=c_float声明返回类型

    #############################3---字符串char#############################
    """
    对于字符串char* ,在声明传入参数类型时,需要声明为字符指针,然后分配一块char数组,最后把这个数组强制转换为字符指针
    并且,在把python脚本中的数据结构导入c++中时,需要把str转换为bytes或者bytesarray类型,并且进行迭代器分解
    """
    charout=dll.charout
    charout.argtypes=[c_char]  #传入参数为单字符
    charout.restype=c_char       #返回值也为char型
    print charout("a")
    #或
    dll.charout.restype=c_char
    print dll.charout(c_char("a"))
    #############################3---字符串char*#############################
    """
    对于字符串char* ,在声明传入参数类型时,需要声明为字符指针,然后分配一块char数组,最后把这个数组强制转换为字符指针
    并且,在把python脚本中的数据结构导入c++中时,需要把str转换为bytes或者bytesarray类型,并且进行迭代器分解
    """
    hello=dll.HelloWorld
    hello.argtypes=[c_char_p]    #传入参数为字符指针
    STR=(c_char * 100)(*bytes("相信你还在这里!")) #把一组100个的字符定义为STR
    cast(STR, POINTER(c_char))
    hello(STR)

    #############################4---int*#############################
    Ints=dll.Ints
    Ints.argtypes=[POINTER(c_int),c_int]
    INT=(c_int * 100)(*[1,2,3]) #把列表传入变长参数args*中
    cast(INT, POINTER(c_int))
    Ints(INT,c_int(3))

     

     

    参考文章1:

    https://blog.csdn.net/u013639526/article/details/41724417函数调用规约(__stdcall 和 __cdecl 的区别浅析)

    参考文章2:

    https://docs.python.org/3.6/library/ctypes.html   (The Python Standard Library: ctypes

    参考文章3:

    https://blog.csdn.net/mfq1219/article/details/81945448 (最全的ctypes总结)

    参考文章4:

    https://blog.csdn.net/mak0000/article/details/82387461 (python ctypes中文帮助文档)

    参考文章5:

    https://blog.csdn.net/yaningli/article/details/79948811 (python ctypes 的使用总结文档)

     

    参考文章6:

    https://www.jianshu.com/p/299c433f4e5d (python 调用dll的简单例子)

    参考文章7:

    https://blog.csdn.net/yaningli/article/details/79948811 (python ctypes 的使用总结文档)

     

     

     

     

     

     

     

    展开全文
  • Python 调用 DLL

    千次阅读 2019-04-18 10:49:51
    Python 调用 DLL( ctypes库) 1、ctypes 库 ctypes 库用来调用 windows 的 dll / linux 的 so python 自带 ctypes 库,不需额外安装 2、调用 DLL 第一步:用 c/c++,创建一个 dll 第二步:把生成的...

    Python 调用 DLL


    一、C++ 编写 DLL

    1、.hpp 头文件

    // dll_test.hpp
    
    #ifdef DLL_TEST
    #define MY_API _declspec(ddllexport)    // 当头文件作为DLL工程编译时(会用到DLL工程中的 .cpp 文件),设为导出。
    #ELSE                                                                            
    #define MY_API _declspec(dllimport)    // 当DLL被其它工程调用时(不会用到DLL工程中的 .cpp 文件),设为导入。
    #endif 
    
    //需要被外界调用的类(父类)
    class MY_API my_class              
    {
    public:
    	// 类成员变量
    	int x;
    	// 类方法
    	void func(int x);	
    };
    
    // 函数,真正的函数名由编译器决定                                        
    int MY_API add(int x, int y);  
    
    // 函数,函数名不会被改变   
    extern "C" MY_API int  add(int x, int y);  
    

    2、.cpp 文件

    // dll_test.cpp
    
    #define DLL_TEST    // 定义宏,使编译DLL工程时为导出 (结合头文件看)
     
    #include <iostream>
    #include "dll_test.hpp"
    using namespace std;
    
    // 类方法实现 
    void MY_API my_class::func(int x)
    {
         cout <<  x << endl;
    } 
    
    // 函数实现
    int MY_API add(int x, int y)
    {
         return x+y;
    }
    

    二、Python 调用 DLL

    1、ctypes 库

    • ctypes 库用来调用 windows 的 dll / linux 的 so
    • python 自带 ctypes 库,不需额外安装

    2、调用 DLL

    • 第一步:用 c/c++,创建一个 dll
    • 第二步:把生成的 .dll 文件拷贝到 .py 文件的同级目录
    • 第三步:使用 ctypes 库调用 dll
    # 导入 ctypes 库
    from ctypes import *  
    
    # 加载 dll 文件为一个对象
    dll = CDLL("dll_test.dll")  
    
    # 调用 dll 中的函数,dll 要有add()函数
    res = dll.add(1, 2)  
    

    GOOD LUCK!


    展开全文
  • Electron调用dll

    千次阅读 2019-04-22 18:00:35
    Electron通过ffi调用dll(我这里以调用32位dll为例子,如果调用64为dll,更改编译环境即可) 编译 npm install ffi cd .\node_modules\ffi node-gyp rebuild --target=4.0.0 --arch=ia32 --target_arch=ia32 --msvs_...

    Electron通过ffi调用dll(我这里以调用32位dll为例子,如果调用64为dll,更改编译环境即可)

    1. 编译
    npm install ffi
    cd .\node_modules\ffi
    node-gyp rebuild --target=4.0.0 --arch=ia32 --target_arch=ia32 --msvs_version=2015
    

    以同样的方式编译ref

    target=4.0.0 --4.0.0是Electron的版本

    1. 使用

    初始化

    	const ffi = require('ffi')
    	const ref = require('ref')
    	const stringPointer = ref.refType(ref.types.CString)
    

    声明dll方法

          let dllObj = ffi.Library(__dirname + '/dllProject.dll', {
            'add': ['int', ['int', 'int']],
            'stringtest': ['int', [stringPointer, 'int *']],
            'callJsFun': ['void', []],
            'setcallback': ['void', ['pointer']]
          })
          // 设置回调函数 可以直接在dll中调用js方法
          let callback = ffi.Callback('void', ['string'], function (str) {
            alert(str)
          })
          dllObj.setcallback(callback)
    

    调用dll方法

            let results = dllObj.add(1, 2)
            alert(results)
    

    传递指针

            let stringData = ref.alloc('string')
            let stringLen = ref.alloc('int')
            let results = dllObj.stringtest(stringData, stringLen)
            stringData = ref.readPointer(stringData, 0, ref.deref(stringLen))
            alert(results + ': ' + stringData.toString())
    

    GitHub地址

    展开全文
  • Qt调用dll的隐式调用

    千次阅读 2018-11-09 12:50:36
    Qt调用dll的隐式调用 一、前言: Qt调用dll的例子,在网上找了很多个,始终由于自己对Qt不熟的原因总是 失败(本人一直使用vs开发,由于工程上要提供sdk给Qt工程师调用导致各种问题),经过一番折腾终于可以实现...

    一、前言:

    Qt调用dll的例子,在网上找了很多个,始终由于自己对Qt不熟的原因总是 失败(本人一直使用vs开发,由于工程上要提供sdk给Qt工程师调用导致各种问题),经过一番折腾终于可以实现其中的一种调用方式:隐式调用。
    当然,Qt调用dll的方法好多种,然后毕竟不是专门搞Qt的,所以没有专门归纳各种调用方式,紧紧调用成功一种,记录下来。

    二、Qt调用Qt写的dll

    1、建c++库生成dll、lib
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    把所有打钩的去掉,然后一直下一步,完成。
    在这里插入图片描述
    在这里插入图片描述
    编写了两个函数,test01 和 getString(这个函数故意设置,请看后面),功能很简单
    2、新建工程包含头文件.h
    在这里插入图片描述
    在这里插入图片描述
    3、配置库lib
    在这里插入图片描述
    4、将dll放到exe目录
    在这里插入图片描述
    5、写客户端代码

    int main(int argc, char *argv[])
    {
        SecondDlltest test;
        test.test01();
    
        unsigned char  str[]="hello";
    
        std::string temp="hello";
        std::string text=test.getString(temp);
        qDebug()<<text.c_str()<<endl;
    }
    

    6、运行看效果
    在这里插入图片描述

    三、Qt调用vs写的dll(为何要单独讲?因为其中有坑,后面补上)

    过程一样:
    1、生成dll、lib,此时函数和Qt的类是一样的功能
    在这里插入图片描述
    在这里插入图片描述
    2、添加.h、配置lib、dll放到exe目录下(过程一样)
    3、客户端代码
    在这里插入图片描述
    4、运行看效果
    在这里插入图片描述
    请认真看效果,test01已经调用成功,而getString导致了bug,程序崩溃,如何补救?下一节讲解

    四、总结分析

    Qt调用Qt自身的dll,在一切环境下都能正常运行,vs工厂调用vs的dll也能正常调用,然而当跨环境时候,Qt调用vs的dll就出现了问题,原因是:字符集编码引起,QT默认是UTF-8字符集,而vs默认的是Unicode字符集,用c++同一个string写进去的时候(exe写内存)和读取时候(dll读取)的格式不一样,导致乱码了(附上一张内存图,exe中为hello,而dll中显示的是乱码)
    在这里插入图片描述
    在这里插入图片描述
    然而此时程序已经崩溃,不能继续运行了。
    详细分析后,过程应该是这样的:
    1、dll用vs的Unicode编译,认为参数安装Unicode格式读取
    2、Qt按照UTF-8格式将hello,写入参数当中
    3、参数在内存是utf格式的串
    4、dll拿到这块内存,用Unicode格式翻译
    5、翻译出错,内存数据乱码,程序崩溃
    怎么避免这个问题,下一节讲解

    展开全文
  • Matlab调用DLL

    千次阅读 2016-10-16 17:09:12
    Matlab调用DLL (2012-04-20 10:42:06) 转载▼ 标签: 杂谈 分类: 编程之旅  本来想把算法写成一个DLL的形式,这样既可以在控制软件中方便调用,又可以在Matlab中通过调用外部...
  • 方式一 采用LoadLibraryEx ... 若DLL不在调用方的同一目录下,可以用LoadLibrary(L"DLL绝对路径")...但若调用DLL内部又调用另外一个DLL,此时调用仍会失败。解决办法是用LoadLibraryEx: LoadLibraryEx("DLL绝对路
  • python调用dll例子

    千次阅读 2017-12-05 23:10:22
    python调用dll例子
  • DLL调用(2):C++动态调用DLL

    千次阅读 2017-12-12 18:42:07
    动态调用也被称为显示调用,即在运行程序过程中,需要调用DLL中的功能时才调用。相对于隐式调用,此种方式会有明确的语句载入DLL和获取其中的函数地址,调用过程相对静态调用会复杂一些,但不需要LIB文件的支持,仅...
  • java调用dll

    千次阅读 2018-12-26 10:51:32
    java调用dll 第一步 创建名为JniDemo的Java工程并添加JniDemo.java 第二步 在Java类中添加native方法 public native static void set(int i); public native static int get(); 第三步 使用javah命令生成头文件 1...
  • Flex调用DLL

    千次阅读 2015-05-21 12:04:45
    由于项目需要,需要使用flex air调用DLL文件;C/S架构。实现功能如下: 下载aperture.exe,http://aperture.fluorinefx.com/?page_id=2; * flex调用DLL,需要提供DLL的文件名、CLSID;  如果CLSID无法得到,...
  • DLL调用(1):C++静态调用DLL

    千次阅读 2017-12-12 18:07:49
    DLL(Dynamic Link Library)即动态链接库,DLL文件中存放封装的函数和类,当程序需要调用DLL所定义的功能时,需要先载入DLL文件,然后取得函数的地址,最后进行调用。 通过DLL来调用功能,可实现代码的封装与复用...
  • JNA 调用DLL DLL应该放入哪个目录

    千次阅读 2019-05-20 17:22:40
    JNA 调用DLL DLL应该放入哪个目录? 调试发现需要放入 jdk1.5.0_20\bin 参考: http://www.qchcloud.cn/tn/article/32
  • Java调用dll文件

    千次阅读 2020-04-21 23:20:55
    近期根据C++做了一个图片质量检测的项目,目前需要在在java中进行调用,所以先在C++上生成dll文件,然后基于java调用dll文件实现功能。 环境: C++:VS2017(之前配置opencv真是要了老命) java:idea2020+jdk1.8。 ...
  • Python调用DLL

    千次阅读 2015-12-11 19:35:24
    用python调用dll时需要根据不同的调用约定而使用不同的函数。但是不管什么调用,最后都必须用extern “C”来防止名字粉碎。 dll源文件: [cpp] view plaincopy #include 
  • 同名dll内容不一致,冲突,修改其中一个lib的内容改变dll名称。修改lib中dll名称就能改变调用dll的名称
  • NodeJS调用Dll模块

    千次阅读 2019-09-18 11:21:13
    NodeJs调用Dll中的类或者函数接口有一套基于V8的框架,有固定的写法: 注册入口函数,js在require的时候会调用该注册接口 Param1: 注册名称,无特殊要求 Param2: js第一次加载模块时调用的函数接口,一般用于注册...
  • 利用C++制作dll并调用dll

    万次阅读 2016-05-26 15:58:40
    Abstract:本文讲解如何利用c++制作dll并调用dll,用一个简单的加法函数来作为演示,并给出图形界面。1. 打开vs(我用的是vs2010),然后点击文件—>文件—>新建—>项目,选择Win32控制台应用程序。并输入你想建立的...
  • C#调用DLL库的方法

    万次阅读 2019-01-04 14:19:59
    net平台上,调用dll文件有2种含义1、调用托管dll,即你使用。net平台开发的dll,属于托管代码2、调用非托管dll,即传统的dll,一般是C++,VB,DELPHI等等开发出来的,属于非托管代码。从你的意思中看出来你现在是调用...
  • Java使用jacob调用dll

    2017-03-15 01:51:22
    想通过jacob从dll文件中调用dll了面的一个集合缺一直报错求大神帮助
  • Java调用DLL的技术方便易用,使用Java开发前台界面可以更快速,也能带来跨平台性。使用JNI、Jawin和Jacb使得Java在Windows平台下使用COM和 DLL的更加方便。   Java语言本身具有跨平台性,如果通过Java调用...
  • Nodejs如何调用Dll模块

    千次阅读 2018-09-17 07:27:05
    一、为什么需要用node.js调用dll? 公司项目采用Electron( electronjs.org/ )开发pc应用,会涉及到与底层硬件设备的通信,而sdk封装 基本上都是通过 C++ 动态链接库dll实现的。 有两种方案可供选择: 方案一: ...
  • java调用dll方法详解

    万次阅读 2018-09-09 23:29:47
    初学java调用dll库时,经常出现无法加载库、找不到方法等错误(UnsatisfiedLinkError等)。本文对常见的问题进行详细的分析,给出较为完整的解决方案。 正文: 在java中写一个native方法,实现对dll的调用,一般...
  • windows下python调用dll的方法

    千次阅读 2019-12-29 15:48:54
    windows下python调用dll的方法VS生成dll可供python调用的dll生成python调用dll方法传入实数demo传入指针demo1传入指针demo2传入字符串demo传入字符串指针并返回字符串demo完整代码 VS生成dll 关于VS生成dll文件供另...
  • [C++]调用DLL有两种方法——静态调用和动态调用 (一).静态调用其步骤如下:  1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;  2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的...
  • QT 调用 DLL 方法

    2015-01-16 16:44:53
    Qt调用DLL方法一:使用Win32 API 在显式链接下,应用程序必须进行函数 调用以在运行时显式加载 DLL。为显式链接到 DLL,应用程序必须: ? 调用 LoadLibrary(或相似的函 数)以加载 DLL 和获取模块句柄。 ? 调用...
  • LabVIEW调用DLL动态链接库

    千次阅读 2020-02-04 21:27:01
    LabVIEW调用DLL动态链接库 示例一 通过调用DLL实现数组求和。输入一个10个元素的数组,返回全部元素之和。 1.生成DLL VS中选择创建动态链接库项目 在头文件和源文件文件夹分别创建相应的.h .cpp文件 在test.h中...
  • 在工程应用中,动态链接库(dll)的重要性和灵活性是不言而喻的,这里将介绍一种最基本的创建和调用dll的方法,下面是使用VC++6.0的实现过程: 1. 创建dll 如上图所示,选择Win32 Dynamic-Link Library,创建名为...
  • python调用dll

    千次阅读 2011-09-08 20:30:36
    python中如果要调用dll,需要用到ctypes模块,在程序开头导入模块 import ctypes 由于调用约定的不同,python调用dll的方法也不同,主要有两种调用规则,即 cdecl和stdcal,还有其他的一些调用约定,关于他们的不同...
  • C++调用dll

    千次阅读 2012-05-17 18:14:42
    调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同。Windows提供了两种将DLL映像到进程地址空间的方法:隐式调用(通过lib和头文件)和显式...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,459
精华内容 18,983
关键字:

调用dll