精华内容
下载资源
问答
  • python调用dll动态链接库
    千次阅读
    2022-04-16 23:34:04

    目录

    方法一、ctypes库方式

    方法二、shell方式


    方法一、ctypes库方式

    使用ctypes库调用。这个方法网上一搜都是。

    import ctypes
    obj = ctypes.WinDLL('PrScrn.dll')
    obj.PrScrn()

    但有一个问题,现在Python的默认版本都是64位,但dll有很多是32位,因此就会出现:

    OSError: [WinError 193] %1 不是有效的 Win32 应用程序

    解决方法是:更换32位的Python。conda里可以通过set CONDA_FORCE_32BIT=1来设置32位环境,并新建虚拟环境。但难免有点麻烦。。。

    方法二、shell方式

    如果要求不高,只是简单调用一下,可以使用shell方式。

    在windows下有个工具:rundll32.exe,用法如下:

    rundll32 DllName,FunctionName [Arguments]

    因此可以这样调用:

    import os
    
    os.system('RUNDLL32.EXE PrScrn.dll PrScrn')

    注:对64位的dll,对应有一个runndll64.exe。

    用这个工具还能改实现很多有意思的功能,如弹出重启对话框:

    Rundll32.exe shell32.dll,RestartDialog

    更多相关内容
  • 最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用。ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调用函数。一、Python调用DLL里面的导出...

    最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用。

    ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调用函数。

    一、Python调用DLL里面的导出函数

    1.VS生成dll

    1.1 新建动态链接库项目

    1.2 在myTest.cpp中输入以下内容:

    //myTest.cpp : 定义 DLL 应用程序的导出函数。//#include "stdafx.h"

    #define DLLEXPORT extern "C" __declspec(dllexport) //放在 #include "stdafx.h" 之后

    //两数相加

    DLLEXPORT int sum(int a, intb) {return a +b;

    }

    注意:导出函数前面要加  extern "C" __declspec(dllexport) ,这是因为ctypes只能调用C函数。如果不用extern "C",构建后的动态链接库没有这些函数的符号表。采用C++的工程,导出的接口需要extern "C",这样python中才能识别导出的函数。

    1.3生成dll动态链接库

    因为我的python3是64位的,所以VS生成的dll要选择64位的,如下所示:

    点击标题栏的 生成 -> 生成解决方案

    1.4 查看生成的dll动态链接库

    2.Python导入dll动态链接库

    用python将动态链接库导入,然后调用动态链接库的函数。为此,新建main.py文件,输入如下内容:

    from ctypes import *

    #----------以下四种加载DLL方式皆可—————————#pDLL = WinDLL("./myTest.dll")#pDll = windll.LoadLibrary("./myTest.dll")#pDll = cdll.LoadLibrary("./myTest.dll")

    pDll = CDLL("./myTest.dll")#调用动态链接库函数

    res = pDll.sum(1,2)#打印返回结果

    print(res)

    运行结果如下所示:

    二、Python调用DLL里面的实例方法更新全局变量值

    1.VS生成dll

    1.1 添加 mainClass 类,内容如下:

    mainClass.h:

    #pragma once

    extern intdta;classmainClass

    {public:

    mainClass();~mainClass();voidproduceData();

    };

    mainClass.cpp:

    #include "stdafx.h"#include"mainClass.h"

    int dta = 0;

    mainClass::mainClass()

    {

    }

    mainClass::~mainClass()

    {

    }voidmainClass::produceData() {

    dta= 10;

    }

    1.2 更改 myTest.cpp 内容

    myTest.cpp:

    #include "stdafx.h"

    #define DLLEXPORT extern "C" __declspec(dllexport) //放在 #include "stdafx.h" 之后#include"mainClass.h"

    //返回实例方法里面更新数据后的值

    DLLEXPORT intgetRandData() {

    mainClass dataClass=mainClass();

    dataClass.produceData();returndta;

    }

    1.3 生成64位dll

    2.Python导入dll动态链接库

    明显可以看出,在C++里设置的全局变量的值已经从0变为10了,说明python可以通过调用dll里面的实例方法来更新全局变量值

    三、Python_ctypes 指定函数参数类型和返回类型

    前面两个例子C++动态链接库导出函数的返回类型都是int型,而Python 默认函数的参数类型和返回类型为 int 型,所以Python 理所当然的 以为 dll导出函数返回了一个 int 类型的值。但是如果C++动态链接库导出的函数返回类型不是int型,而是特定类型,就需要指定ctypes的函数返回类型 restype 。同样,通过ctypes给函数传递参数时,参数类型默认为int型,如果不是int型,而是特定类型,就需要指定ctypes的函数形参类型 argtypes 。

    接下来,我将举一个简单例子来说明一下

    myTest.cpp:

    #include "stdafx.h"

    #define DLLEXPORT extern "C" __declspec(dllexport) //放在 #include "stdafx.h" 之后#include //使用string类型 需要包含头文件

    using namespace std; //string类是一个模板类,位于名字空间std中//字符串

    DLLEXPORT char *getRandData(char *arg) {returnarg;

    }

    python代码:

    from ctypes import *pDll= CDLL("./myTest.dll")########## 指定 函数的参数类型 #################

    pDll.getRandData.argtypes =[c_char_p]#第一个参数

    arg1 = c_char_p(bytes("hello", 'utf-8'))########## 指定 函数的返回类型 #################

    pDll.getRandData.restype =c_char_p########### 调用动态链接库函数 ##################

    res =pDll.getRandData(arg1)#打印返回结果

    print(res.decode()) #返回的是utf-8编码的数据,需要解码

    或者如下形式:

    from ctypes import *pDll= CDLL("./myTest.dll")########## 指定 函数的返回类型 #################

    pDll.getRandData.restype =c_char_p########### 调用动态链接库函数 ##################

    res = pDll.getRandData(b'hello') #或者变量.encode()

    #打印返回结果

    print(res.decode()) #返回的是utf-8编码的数据,需要解码

    运行结果:

    四、Python_ctypes dll返回数组_结构体

    在ctypes里,可以把数组指针传递给dll,但是我们无法通过dll获取到c++返回的数组指针。由于python中没有对应的数组指针类型,因此,要获取dll返回的数组,我们需要借助结构体。

    myTest.cpp:

    #include "stdafx.h"

    #define DLLEXPORT extern "C" __declspec(dllexport) //放在 #include "stdafx.h" 之后#include //使用string类型 需要包含头文件

    using namespace std; //string类是一个模板类,位于名字空间std中

    typedefstructStructPointerTest

    {char name[20];intage;int arr[3];int arrTwo[2][3];

    }StructTest,*StructPointer;//sizeof(StructTest)就是求 struct StructPointerTest 这个结构体占用的字节数//malloc(sizeof(StructTest))就是申请 struct StructPointerTest 这个结构体占用字节数大小的空间//(StructPointer)malloc(sizeof(StructTest))就是将申请的空间的地址强制转化为 struct StructPointerTest * 指针类型//StructPointer p = (StructPointer)malloc(sizeof(StructTest))就是将那个强制转化的地址赋值给 p

    StructPointer p = (StructPointer)malloc(sizeof(StructTest));//字符串

    DLLEXPORT StructPointer test() //返回结构体指针

    {

    strcpy_s(p->name, "Lakers");

    p->age = 20;

    p->arr[0] = 3;

    p->arr[1] = 5;

    p->arr[2] = 10;for (int i = 0; i < 2; i++)for (int j = 0; j < 3; j++)

    p->arrTwo[i][j] = i*10+j;returnp;

    }

    python代码:

    #返回结构体

    importctypes

    path= r'./myTest.dll'dll=ctypes.WinDLL(path)#定义结构体

    class StructPointer(ctypes.Structure): #Structure在ctypes中是基于类的结构体

    _fields_ = [("name", ctypes.c_char * 20), #定义一维数组

    ("age", ctypes.c_int),

    ("arr", ctypes.c_int * 3), #定义一维数组

    ("arrTwo", (ctypes.c_int * 3) * 2)] #定义二维数组

    #设置导出函数返回类型

    dll.test.restype = ctypes.POINTER(StructPointer) #POINTER(StructPointer)表示一个结构体指针#调用导出函数

    p =dll.test()print(p.contents.name.decode()) #p.contents返回要指向点的对象 #返回的字符串是utf-8编码的数据,需要解码

    print(p.contents.age)print(p.contents.arr[0]) #返回一维数组第一个元素

    print(p.contents.arr[:]) #返回一维数组所有元素

    print(p.contents.arrTwo[0][:]) #返回二维数组第一行所有元素

    print(p.contents.arrTwo[1][:]) #返回二维数组第二行所有元素

    运行结果:

    展开全文
  • 最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用。 ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调用函数。 一、Python调用DLL里面的...
  • python调用dll动态链接库

    万次阅读 2018-05-09 17:51:58
    还是调用动态库,各种调用,但是呢,Python调用dll貌似不麻烦,至少我第一次就调用成功嘞。至于Python,我连语法都不知道,不过问题不大,边百度边写。环境:好像都可以,Python我在官网下载的python-3.6.4-amd64。...

    还是调用动态库,各种调用,但是呢,Python调用dll貌似不麻烦,至少我第一次就调用成功嘞。

    至于Python,我连语法都不知道,不过问题不大,边百度边写大笑

    环境:

    好像都可以,Python我在官网下载的python-3.6.4-amd64。

    然后准备一个简单的dll(就普通的dll百度有一大堆就写一个加法就行,这里我就直接用我之前的GB.dll啦)

    然后写代码:

    from ctypes import *
    dll = cdll.LoadLibrary('Health.dll')
    #初始化
    ret = dll.Initialization(0,"192.168.0.58".encode(),4000)

    print(ret)

    输出结果

    就ok,其中encoude和decode用法参考(网址点我)

    然后就是函数返回值,对应类型参考:https://blog.csdn.net/ab17171313/article/details/80256465

    dll.GetCharData.restype = c_char_p#指定返回值类型,这里c_char_p指c中 char*类型


    其中获取到的char*值直接输出为,若要去掉b'',则加上.decode("utf-8")

    print(Time.decode("utf-8"))

    运行后输出,ok


    当然,还有中文的处理,加上.decode("gbk")就行。



    展开全文
  • 本文以实例讲解了Python调用C/C++ DLL动态链接库的方法,具体示例如下: 示例一: 首先,在创建一个DLL工程(本例创建环境为VS 2005),头文件: //hello.h #ifdef EXPORT_HELLO_DLL #define HELLO_API __declspec...
  • python 调用 dll

    软件+环境:VS2013、C#、pycharm、python3.8


    一、利用VS2013 编写 dll

    1、新建项目,请把名称写的容易识别一点 

     

    2、代码如下,大致就包含两个函数,一个返回 一列字符串,一个返回 根据参数做加法

     C# 完整代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace dlltest
    {
        public class Class1
        {
            public string _doc_()
            {
                return "dlltest 是一个C#的DLL动态链接库";
            }
    
    
            public int add (int a, int b)
            {
    
                return a + b;
            }
    
        }
    }
    

    3、点击 菜单栏->重新生成解决方案

     此时 输出栏 我们可以看到有个dll文件路径,所以你懂的,我们已经做出了个简单的dll文件

    接下来的任务就是如何使用 python调用dll


    二、python 调用 dll 

     python 调用dll 常见有两个库(ctypes[系统自带]、clr)。

    ctypes一般在C++的dll中使用、C#我们使用clr。

    安装:pip install pythonnet   或者  使用 pycharm库安装

    import clr  # C#
    
    
    # dll路径
    path = r'd:\microsoft visual studio 2013\Projects\dlltest\dlltest\bin\Debug\dlltest.dll'
    # 加载dll
    # clr.FindAssembly(path) 由于作者使用python 3.8 该方法表示已经弃用,故采取下列方法
    clr.AddReference(path)
    
    # 导入 命名空间内 所有的 Class
    from dlltest import *
    
    # 实例化对象
    TestClass = Class1()
    
    # 使用dll中的方法
    print(TestClass._doc_())
    
    print("1+2={}".format(TestClass.add(1, 2)))

    python控制台 output:

                            dlltest 是一个C#的 DLL动态链接库
                            3


    三、报错

    1、如果 调用的是C#生成的dll,请使用clr库

    2、clr 模块不存在、或者AddReference方法不存在

    请安装 pythonnet 

    3、python 编译器发现代码部分 飘红,请不用在意,这是由于pycharm不知道这个dll里面到底有什么方法,不影响程序运行,我们在看有些程序自带库的时候偶尔也有这情况。

    展开全文
  • 介绍如何通过ctypes模块调用 c/c++ dll动态链接库,如何对函数参数的类型进行转换,特别是结构体与指针,如何转换为python格式,以及如何赋值 ,传入dll 中。
  • 如何使用Python调用dll动态链接库

    万次阅读 2018-12-08 00:11:15
    .dll是使用C或者C++编译的动态链接库,一般留有函数入口可以进行调用。 首先我们通过阅读原项目的源码,找到入口的函数名称、传参规则和类型、返回值类型。 然后使用Python ctype库加载dll库,并且调用函数,得到...
  • 下面这几句代码就可以导出dll里的函数,可以在后面打断点查看导入的类...from c#的名字 import * 主程序: # -*- coding: cp936 -*- import socket import time import clr # add c# suppor import re import c
  • 本部课程共分5章,涵盖了同步异步IO、线程池、动态链接库、注入DLL、拦截API五个主题。学习后可以彻底俯视众多windows初级程序员,尤其是众多专业工具的使用,如:dumpbin、debugview、processexplorer等,可以使你...
  • 动态链接库(.dll,.so)是系统开发中一种非常重要的跨语言协作方式。把python语言写成的算法编译成动态库,能够提供给其他语言调用,这能够在很大程度上提高算法的开发效率。 但是,虽然python可以调用其他语言生成...
  • 本部课程共分5章,涵盖了同步异步IO、线程池、动态链接库、注入DLL、拦截API五个主题。学习后可以彻底俯视众多windows初级程序员,尤其是众多专业工具的使用,如:dumpbin、debugview、processexplorer等,可以使你...
  • 本例中默认读者已经掌握动态链接库的生成方法,如果不太清楚的可以参考动态链接库的使用调用上例动态链接库的使用中的sum.soimport ctypesso = ctypes.CDLL('./sum.so')print "so.sum(50) = %d" % so.su...
  • 左边是 C 的结构成员名称,右边则是在 python 中声明一下各个成员的类型。其他的一些类型请参见官方文档。 此外还需要注意一下类似于 c_int , c_void_p 等等的定义是在 ctypes 中的,如果是用 import ctypes ...
  • python调用C语言动态链接库详解

    千次阅读 2021-10-16 22:09:07
    Python 调用动态链接库构建动态链接库 Python 调用C语言动态链接库构建动态链接库 python动态链接库基础调用 python动态链接库结构体调用 python动态链接库回调...ctypes是Python调用c的动态链接库的一个内置模块。...
  • Python真的是非常强大的胶水语言,可以与其他语言无缝衔接,之前做的项目是使用Pyqt5与C#结合编程,这里记录下Python调用C#的dll公共的方法。 一、安装 想要使用C#生成的dll公共则需要安装对应的调用包,直接...
  • 主要给大家介绍了关于如何在ubuntu中python调用C/C++方法之动态链接库的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧
  • python调用c#dll库时要先安装clr,即安装pythonnet,参考文章:https://www.cnblogs.com/kevin-Y/p/10235125.html(为在python中使用dotnet程序安装clr)但是输入命令后遇到错误“'pip' 不是内部或外部命令,也...
  • 1. 首先VC++的DLL的导出函数定义成标准C的导出函数: 复制代码 代码如下:#ifdef LRDLLTEST_EXPORTS #define LRDLLTEST_API __declspec(dllexport) #else #define LRDLLTEST_API __declspec(dllimport) #endif extern...
  • 一丶C++ 编译类动态库1)新建生成.dll文件的空项目 双击: 2)编写头文件:pycall.h//test.h#pragma onceclass Mymath {int sum(int, int);int sub(int, int);};1234567注:#define DLLEXPORT extern “C” __...
  • python 版本:python3.6.5 32位 C++编译:MinGW (Minimalist GNU for Windows)。 注意这是win32 的版本,注意位数应当与已经安装的Python保持一致。 1,安装下载MinGW, Download mingw-get-setup.exe (86.5 kB...
  • 环境:Window 10,VS 2019, Python 2.7.12, 64bit1,打开 VS 2019,新建C++ Windows 动态链接库工程 Example,加入下列文件,如果Python是64位的则在VS中 Solution platforms 选择 x64 编译成64位的 DLL;...
  • 主要介绍了Windows系统Python直接调用C++ DLL文件的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,240
精华内容 3,296
热门标签
关键字:

python调用dll动态链接库