由源码生成Python可调用的dll

news2024/11/15 8:52:05

1. 不带参数的函数与调用

  • blog.csdn.net/qq 40833391/article/details/128000638
  • python编程(python调用dll程序)_python 调用dll_嵌入式-老费的博客-CSDN博客
  • 思路很简单,只需要在Visual Studio中设置输出类型即可

1.1. 创建项目

  • 首先创建一个c语言或者C++项目
  • 运行出来hello world
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oGHEycon-1686290398095)(null)]

1.2. 修改源码

  • 创建一个myDLL类
    动态链接库导出的类需要加关键字__declspec(dllexport),表示该函数将要被导出,否则无法生成lib文件。
    创建一个头文件和一个源文件
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MzcIXNrb-1686290398108)(null)]
  • myDLL.h
class Mymath {
	static void print_hello();
};

  • myDLL.cpp
#define DLLEXPORT extern "C" __declspec(dllexport)

#include "myDLL.h"
#include <iostream>

//打印hello world
DLLEXPORT void print_hello() {
	std::cout << "Hello World!" << std::endl;
}

1.3. 编译

  • 之后修改生成类型,改为dll
    项目属性-常规-配置类型-动态库,将其改为dll
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9lkZghWw-1686290398164)(null)]
  • 之后再次进行生成
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DGVCpVeL-1686290398151)(null)]
  • 可以看到现在在release文件夹中已经是生成了dll文件
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fSvi8byp-1686290398069)(null)]
  • 这个dll就是64位的dll,可以用于后续的其他程序的调用

1.4. 调用

  • 我们使用Python来进行调用
from ctypes import *
lib = CDLL("Project8.dll")
result = lib.print_hello()

可以看到,这样已经是正常调用了

hello world 的完整项目

  • remnote user data.s3.amazonaws.com/WDid6o0N1unizjdABasfd5CkChS3iMYAhlVceIIKKZb5soJ9cTsyI2qUaHWA6t3HsbxP HjIjPCHJS1f6BuEXpkOkSimcZ nvgDDa7ntB1f8VAHXabynHrUhMEtWTgtd.zip

2. 带参数的函数编译和调用

2.1. 新建.h头文件

pycall.h

### //test.h
#pragma once
class Mymath {
	int sum(int, int);
	int sub(int, int);
};
#pragma once

2.2. 新建cpp文件

pycall.cpp

### #define DLLEXPORT extern "C" __declspec(dllexport)
#include"pycall.h"
//两数相加
DLLEXPORT int  sum(int a, int b) {
	return a + b;
}
//两数相减
DLLEXPORT int sub(int a, int b) {
	return a - b;
}

2.3. 编译

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rIYOSULi-1686290398190)(null)]

2.4. 调用

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8VPmX5yQ-1686290398082)(null)]

3. 报错

  • AttributeError: function ‘printHelloWorld’ not found

  • 要调用的这个dll文件里面没有这个函数

  • 应该是在.cpp文件中定义函数的时候没有在之前添加DLLEXPORT用来声明供外部调用,所以生成的dll文件中没有这个函数,因此会出错
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-llhpeK49-1686290398137)(null)]

  • OSError: [WinError 126] 找不到指定的模块。

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eRTB3MQ2-1686290398177)(null)]

  • 出现找不到指定模块的问题通常是程序要加载某个DLL文件,但是这个DLL文件不存在就报错了。

  • 可以在PyCharm中打一个断点,看到底是缺哪个dll文件

  • dll文件的位数不匹配
    如果dll是32位,而自己的Python是64位的,那么肯定是无法正常用的

  • 尝试使用ctypes.windll.dx代替CDLL加载dx.dll

  • DLL依赖其他DLL
    如果dx.dll依赖其他DLL,而其他DLL没有被找到,也会产生此错误

匹配
如果dll是32位,而自己的Python是64位的,那么肯定是无法正常用的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HashMap集合】存储学生对象并遍历

HashMap集合存储学生对象并遍历 1.键是String&#xff0c;值是Student 需求&#xff1a;创建一个HashMap集合&#xff0c;键是学号(String)&#xff0c;值是学生对象(Student)。存储三个键值对元素&#xff0c;并遍历 思路&#xff1a; 定义学生类 创建HashMap集合对象 创建…

uni.navigateBack()返回上一页携带参数的实现

a页面跳转b页面&#xff0c;再b页面点击确定返回到a页面刷新列表 //b页面confirm(){let pages getCurrentPages();//当前页面let prevPage pages[pages.length - 2];//上一个页面prevPage.setData({//直接给上一个页面赋值isRefresh: true})uni.navigateBack();} 返回到a页面…

适用于 Linux 的 Windows 子系统wsl文档

参考链接&#xff1a;https://learn.microsoft.com/zh-cn/windows/wsl/ 鸟哥的Linux私房菜&#xff1a;http://cn.linux.vbird.org/ http://cn.linux.vbird.org/linux_basic/linux_basic.php http://cn.linux.vbird.org/linux_server/ 目录 安装列出可用的 Linux 发行版列出已…

【Protobuf】Map类型的使用

文章目录 2.4 map 类型一、 基本认识二、map相关函数4.3 contact2.4的改写 2.4 map 类型 本系列文章将通过对通讯录项目的不断完善&#xff0c;带大家由浅入深的学习Protobuf的使用。这是Contacts的2.4版本&#xff0c;在这篇文章中将带大家学习Protobuf的 map 语法&#xff0c…

STM32F407软件模拟I2C实现MPU6050通讯(CUBEIDE)

STM32F407软件模拟I2C实现MPU6050通讯&#xff08;CUBEIDE&#xff09; 文章目录 STM32F407软件模拟I2C实现MPU6050通讯&#xff08;CUBEIDE&#xff09;模拟I2C读写的实现mpu6050_iic.cmpu6050_iic.h代码分析 复位&#xff0c;读取温度&#xff0c;角度等函数封装mpu6050.cmpu…

HTTPS 原理浅析及其在 Android 中的使用

1.HTTP协议的不足 HTTP1.x在传输数据时&#xff0c;所有传输的内容都是明文&#xff0c;客户端和服务器端都无法验证对方的身份&#xff0c;存在的问题如下&#xff1a; 通信使用明文(不加密)&#xff0c;内容可能会被窃听&#xff1b;不验证通信方的身份&#xff0c;有可能遭…

Hbase-- 03

4.原理加强 4.1数据存储 4.1.1行式存储 传统的行式数据库将一个个完整的数据行存储在数据页中 4.1.2列式存储 列式数据库是将同一个数据列的各个值存放在一起 传统行式数据库的特性如下&#xff1a; ①数据是按行存储的。 ②没有索引的查询使用大量I/O。比如一般的数据库表…

vue3 element-plus后台管理系统实现登录与记住密码功能

一、效果 二、代码部分 1、勾选记住密码布局代码 2、判断是否勾选&#xff0c;勾选则保存账号密码&#xff0c;否则不保存账号密码&#xff0c;由于是demo,故并没有做加密&#xff0c;如果是生成最好是对密码做加密处理。 3、页面挂载的时候需要背叛的是否保存密码&#xff0c;…

JDK8 ConcurrentHashMap 怎么放弃 Lock 使用 synchronized 了

synchronized 之前一直都是重量级锁&#xff0c;但是 JDK6 中官方是对他进行过升级&#xff0c;引入了偏向锁&#xff0c;轻量级锁&#xff0c;重量级锁&#xff0c;现在采用的是锁升级的方式去做的。针对synchronized 获取锁的方式&#xff0c;JVM 使用了锁升级的优化方式&…

十行代码,就能真正让你理解DMA(CPU的秘书)

下面的代码是单片机串口发送数据的程序. char a0xAA;//定义变量a,值为0xAA&#xff1b; TXREG a;//把数据由内存转移到串口外设&#xff1b;那我们定义的变量a的值存储在哪里了呢&#xff1f;可以看下单片机的逻辑框图。 变量其实都是存在一个叫SRAM的存储器中&#xff0c;它…

Playwright 和 Selenium 的区别是什么?

前言 最近有不少同学问到 Playwright 和 Selenium 的区别是什么&#xff1f;有同学可能之前学过 selenium 了&#xff0c;再学一个 playwright 感觉有些多余&#xff0c;可能之前有项目已经是 selenium 写的了&#xff0c;换成 playwright 需要时间成本&#xff0c;并且可能有…

【支付系统】核心支付流程

支付在产品中常见的用处为购买和充值.这两种功能操作大相径庭,其中购买相对充值多了很多步骤,它需要锁商品或者库存,还需要超时未支付取消订单等操作.在这篇文章中主要探讨支付部分,属于购买和充值公共部分. 下面是绘制的简易支付时序图 以上时序图并非完整,其实核心步骤就是, …

商城购买会员打折满减优惠券商品

文章目录 前言一、代码结构二、UML图三、代码实现3.1.domain3.2.enums3.3.strategy3.4.service3.5.config 四、单元测试五、模式应用六、问题及优化思路6.1.问题6.2.优化 总结 前言 使用策略模式、工厂方法模式、单例模式实现一些购买策略&#xff0c;需求&#xff1a;商城商品…

服装库存管理系统 Mybatis+Layui+MVC+JSP【完整功能介绍+实现详情+源码】

完整源码资料 地址直达&#xff1a;http://t.csdn.cn/RWsGw 前言 这是大二时候写的第一个Java项目&#xff0c;框架基本上都没有用到、而且用到的技术很老很老。只简单使用了一个Mybatis简化数据库的操作。前端框架用的还是Layui&#xff0c;贼难用。闲的无聊&#xff0c;对这…

缺少成本票怎么解决?首选自然人代开,方便又快捷!

《税筹顾问》专注于园区招商&#xff0c;您的贴身节税小能手&#xff0c;合理合规节税&#xff01; 成本票缺失导致的严重结果就是&#xff0c;缺少成本入账&#xff0c;导致利润虚高&#xff0c;企业所得税变高了&#xff0c;那么现有的解决方式很多&#xff0c;只是一些方法过…

图形学实验(完整文件见上传)

CRect rect; this->GetClientRect(rect); pDC->Ellipse(rect); // DDALineView.cpp : implementation of the CDDALineView class // #include “stdafx.h” #include “DDALine.h” #include “DDALineDoc.h” #include “DDALineView.h” #ifdef _DEBUG #define new…

Qt扫盲-QEvent 理论总结

QEvent 理论总结 一、概述二、事件类型1. Qt 已定义类型2. 开放用户定义类型 三、注册事件 一、概述 Qt的主事件循环(QCoreApplication::exec())从事件队列中获取原生窗口系统事件&#xff0c;将它们转换为QEvents&#xff0c;并将转换后的事件发送给QObjects。 一般来说&…

Multimodal fusion via cortical network inspired losses(第一次优质论文分享)

Multimodal fusion via cortical network inspired losses 论文介绍1. 论文研究的任务是什么&#xff1f;2. 论文关注/拟解决的问题是什么&#xff1f;3. 论文提出什么方法如何解决这个问题&#xff1f;4. 如何设计实验 来证明 所提方法确实解决了 拟解决的问题&#xff1f; 论…

Ada Tutorial(2)SPARK Examiner + SPARK Prover

文章目录 代码 Task1.adb代码 task3.adbtask4.adb 在Ada和SPARK中&#xff0c;SPARK_Mode是一个编译指示&#xff0c;它表示随后的代码将使用SPARK语言规则进行编译和分析。 在with SPARK_Mode > On的影响下&#xff0c;编译器会在编译过程中应用SPARK语言规则&#xff0c;它…

基于“声音”的量子计算机 | Science速递

光子盒研究院 现在&#xff0c;一个基于声音的量子计算机关键构件已被首次被证明是有效的。 构建量子计算机的一种流行方式是将信息编码到光粒子的量子状态中&#xff0c;然后将它们送过镜子和透镜等“迷宫”般的设备阵列来操纵这些信息。量子力学定律指出&#xff0c;量子粒子…