python引用C++ DLL文件若干解释及示例
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文件若干解释及示例的更多相关文章
- C# 动态修改dll的签名 以及修改引用该dll文件的签名
在读取RedisSessionStateProvider配置 提到用mono ceil 来修改程序集以及它的签名,里面GetPublicKey 和GetPubliKeyToken 方法里面那个字符串的 ...
- C# 将引用的DLL文件放到指定的目录下
原文:C# 将引用的DLL文件放到指定的目录下 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/sweety820/article/details/2 ...
- 直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题
直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题.近日工作中,要实现一个功能,那就是业务层方法里面实现自动缓存.编写业务的C#开发人员只关注如何将业务代码编写正确就可以了 ...
- 用vc生成可被python调用的dll文件
前提已经有.c 和.i文件 用swid编译了.i文件生成了wrap.c文件和.py文件 vc创建dll工程 将.h加入到头文件中.c文件和wrap.c文件添加到源文件中 将.i文件添加到工程目录下To ...
- VS2010 项目引用了DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称 <转>
昨天写了一个很小的winform程序,其中引用了自己写的两个dll文件. 本来认为轻松搞定,结果一编译居然提示:未能找到类型或命名空间名称..... 于是删掉两个dll重新引用,再编译结果依旧!很是郁 ...
- 转载:C# 将引用的DLL文件放到指定的目录下
当软件引用的DLL比较多的时候,全部的DLL都放在exe同目录下,显得比较乱,如果能把dll放到响应的文件夹下面,就方便很多 下面是解决该问题的一种方法: 右键点击项目:属性->设置,项目会生成 ...
- Vs 引用第三方DLL文件 版本不一致问题 (npoi与memcached中的ICSharpCode.SharpZipLib版本冲突的解决方案)
最近在 做 MailChimp 与网站功能 集成时,发现 MailChimp 2API 中的 MailChimp.dll 中的依赖项 SerivceStack.Text.dll (版本为3.9.71 ...
- VS 项目(c#)引用了 DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称
1. 在项目上点右键-->属性-->应用程序-->目标框架-->修改为.NET Framework 4. 而我原来的设置是.NET Framework 4 Client Pro ...
- 引用动态链接库Dll文件 引用失败 未能添加对HD.dll的引用。请确保此文件可访问并且是一个有效的程序集或COM组件
出现这个问题,是由于使用了非.NET 的动态链接库,需要注册 方法如下: 1.在搜索程序和文件中使用 regsvr32 "D:\Projects\8.01.01.03-重庆大足\lib\Va ...
随机推荐
- UVA - 12295 最短路(迪杰斯特拉)——求按对称路线最短路条数
题意: 给你一个n,然后给你一个n*n的正方形w[i][j],你需要找到一个从(1,1)点走到(n,n)点的最短路径数量.而且这个路径必须按照y=x对称 题解: 我们把左上角的点当作(0,0)点,右下 ...
- 在kubernetes集群里集成Apollo配置中心(3)之交付Apollo-portal至Kubernetes集群
1.执行apollo-portal数据库脚本 apollo-portal数据库脚本链接:https://raw.githubusercontent.com/ctripcorp/apollo/1.5.1 ...
- IDEA 安装常用操作二
一.IDEA启动慢,因为启动时编译.缓存.创建索引等,如果断电等启动异常,可以让缓存索引失效 迁移IDEAD时,可以找到config.system等文件夹, 随着时间使用越久,空间占用越大,另外觉得浪 ...
- 对于kmp求next数组的理解
首先附上代码 1 void GetNext(char* p,int next[]) 2 { 3 int pLen = strlen(p); 4 next[0] = -1; 5 int k = -1; ...
- u-boot 移植 --->3、S5PV210启动序列
通过三星官方的资料S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf,了解到S5PVS10这款芯片的复位过程启动序列.芯片在出厂时就在内部固化了 ...
- LeetCode 题解 593. Valid Square (Medium)
LeetCode 题解 593. Valid Square (Medium) 判断给定的四个点,是否可以组成一个正方形 https://leetcode.com/problems/valid-squa ...
- Async Programming All in One
Async Programming All in One Async & Await Frontend (async () => { const url = "https:// ...
- 线上 S1 故障是什么, 线上 S1 故障, 运维故障分级, 运维, 故障分级, P1 级别故障, 故障, P1 , S1
线上 S1 故障是什么 线上 S1 故障, 运维故障分级, 运维, 故障分级, P1 级别故障, 故障, P1 , S1 故障复盘 https://time.geekbang.org/column/a ...
- css var & auto width css triangle
css var & auto width css triangle https://codepen.io/xgqfrms/pen/PooeEbd css var https://codepen ...
- h5 localStorage和sessionStorage浏览器数据缓存
sessionStorage 会话数据,localStorage 没有过期时间 两个的API基本都一样的 基本的使用 // 保存一个数据 sessionStorage.setItem('key', ' ...