python引用C++ DLL文件若干解释及示例

首先说一下,python不支持C++的DLL,但是支持C的DLL;C++因为和C兼容可以编译为C的DLL,这是下面文章的背景与前提


首先我这儿的示例使用VS2017编译的DLL,先讲过程,再解释

第一步,新建DLL项目

确定之后我们可以看到默认的文件

这时候我们需要新建一个与Test.cpp对应的头文件

这是完成之后的代码结构

下面是Test.h文件的内容和Test.cpp文件的内容及相应解释

// Test.cpp : 定义 DLL 应用程序的导出函数。
// #include "stdafx.h"
#include "Test.h" bool Test1()
{
return true;
} bool Test2()
{
return false;
}

首先我们需要引用Test.h,也就是我们刚刚建立的与之匹配的头文件

Test1和Test2就是我们写的python需要调用的函数,因为python在调用DLL时除了int型其他的返回类型都需要指定,所以我用bool来展示

//Test.h

#pragma once
extern "C" __declspec(dllexport) bool Test1();
extern "C" __declspec(dllexport) bool Test2();

这是我们建立的头文件

第一行VS自动生成,不用管它,它的作用是保证头文件只被编译一次

第二行和第三行就是我们要添加的代码,这两行就是我们定义的函数,有点像以前学C语言的时候老师说的定义在main函数后面的函数要在前面先写一次,记住这个形式就好了。我来讲讲前面的代表什么意思

  • extern “C”

这个的意思是声明的函数可以被其他模块调用,并且编译为C文件

  • __declspec(dllexport)

这是MS VC中专用的关键字,表示将函数、类等声明为导出函数,供其他程序调用

这两个加起来添加到头文件里,声明的函数编译出来就可以被python调用了

python调用方法也很简单

from ctypes import *
dll = CDLL("Test.dll")
dll.Test1.restype = c_bool
# restype是函数的返回类型,c_bool代表返回bool类型,这里的对应关系就自己查一下了
# 除了restype还有argtypes,代表函数的参数类型
print(dll.Test1())

整体大致就是这样了,如果没成功可以给我留言看看,我也是个新手,最近因为一个项目才用到Python,如果有什么不对的请批评指正

关于ctypes的部分,主要参考了这篇博文,感谢”无尽的数字眩晕症“

https://www.cnblogs.com/night-ride-depart/p/4907613.html

python引用C++ DLL文件若干解释及示例的更多相关文章

  1. C# 动态修改dll的签名 以及修改引用该dll文件的签名

    在读取RedisSessionStateProvider配置 提到用mono ceil 来修改程序集以及它的签名,里面GetPublicKey 和GetPubliKeyToken 方法里面那个字符串的 ...

  2. C# 将引用的DLL文件放到指定的目录下

    原文:C# 将引用的DLL文件放到指定的目录下 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sweety820/article/details/2 ...

  3. 直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题

    直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题.近日工作中,要实现一个功能,那就是业务层方法里面实现自动缓存.编写业务的C#开发人员只关注如何将业务代码编写正确就可以了 ...

  4. 用vc生成可被python调用的dll文件

    前提已经有.c 和.i文件 用swid编译了.i文件生成了wrap.c文件和.py文件 vc创建dll工程 将.h加入到头文件中.c文件和wrap.c文件添加到源文件中 将.i文件添加到工程目录下To ...

  5. VS2010 项目引用了DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称 <转>

    昨天写了一个很小的winform程序,其中引用了自己写的两个dll文件. 本来认为轻松搞定,结果一编译居然提示:未能找到类型或命名空间名称..... 于是删掉两个dll重新引用,再编译结果依旧!很是郁 ...

  6. 转载:C# 将引用的DLL文件放到指定的目录下

    当软件引用的DLL比较多的时候,全部的DLL都放在exe同目录下,显得比较乱,如果能把dll放到响应的文件夹下面,就方便很多 下面是解决该问题的一种方法: 右键点击项目:属性->设置,项目会生成 ...

  7. Vs 引用第三方DLL文件 版本不一致问题 (npoi与memcached中的ICSharpCode.SharpZipLib版本冲突的解决方案)

    最近在 做 MailChimp 与网站功能 集成时,发现 MailChimp 2API 中的 MailChimp.dll  中的依赖项 SerivceStack.Text.dll (版本为3.9.71 ...

  8. VS 项目(c#)引用了 DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称

    1. 在项目上点右键-->属性-->应用程序-->目标框架-->修改为.NET Framework 4. 而我原来的设置是.NET Framework 4 Client Pro ...

  9. 引用动态链接库Dll文件 引用失败 未能添加对HD.dll的引用。请确保此文件可访问并且是一个有效的程序集或COM组件

    出现这个问题,是由于使用了非.NET 的动态链接库,需要注册 方法如下: 1.在搜索程序和文件中使用 regsvr32 "D:\Projects\8.01.01.03-重庆大足\lib\Va ...

随机推荐

  1. JavaScript——三

    任务: 其中的"options = options || {}"就代表如果options是一个真的对象,就使用它,否则就给他默认值 在Node函数中: 函数中的this指向wind ...

  2. linux下安装python3.7.2

    1.到python的官网去下载python3.7.2安装包,必须是Linux版本的 2.在/usr/tmp下下载python安装包 wget https://www.python.org/ftp/py ...

  3. 获取txt编码方式

    在操作txt的时候,有时会出现乱码,这是因为没有使用正确的编码方式来操作txt,我们需要先获取txt的编码方式,再进行读写操作.下面是获取txt编码的方法: /// <summary> / ...

  4. java笔试中创建String对象的思考

    题目是这样的下面那些生成新的String对象() A . String  s = new String(); B . String  s = new String("A"); C. ...

  5. codeforces 1045I Palindrome Pairs 【stl+构造】

    题目:戳这里 题意:给1e5个字符串,问有多少对字符串组合,满足最多只有一种字符有奇数个. 解题思路:每种情况用map存一下就行了.感觉这题自己的代码思路比较清晰,所以写个题解记录一下 附ac代码: ...

  6. Single Round Math sdut3260高精度除以低精度

    做高精度除法,从高位开始除..高位除剩下的我们就*10扔给低一位处理,最终余数是在最低位取模得到的 高精除以高精,我们可以这么做,让除数在后面补零,刚好小于被除数,作若干次减法,减的次数加到商里面 然 ...

  7. 如何使用 js 实现tooltips 的 hover 时候坐标的自动计算

    如何使用 js 实现tooltips 的 hover 时候坐标的自动计算 js 监听 mouseover event https://developer.mozilla.org/zh-CN/docs/ ...

  8. 如何在 Apple Watch S6上离线播放音乐

    如何在 Apple Watch S6上离线播放音乐 Apple Watch 离线播放音乐 营销策略,捆绑销售 Apple Watch + AirPods + Apple Music Apple Wat ...

  9. Self-publishing 自出版

    Self-publishing 自出版 出书 传统出版 在过去的几十年中,发布意味着要经过代理商和发布者. 自出版 如今,自助出版允许作者绕过出版商和书店,直接向公众出售. refs https:// ...

  10. leetcode solution cracked tutorial

    leetcode solution cracked tutorial problemset https://leetcode.com/problemset/all/ Top Interview Que ...