.net core 调用c dll_Qt编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)

一、前言

最近这阵子,接了个私活,封装一个开发包俗称的SDK给客户调用,查阅了很多人家的SDK,绝大部分用VC编写,而且VC6.0居多,估计也是为了兼容大量的XP用户及IE浏览器,XP自带了VC6.0运行库,所以无需兼带其他DLL即可运行。也发现有些用汇编和C封装的,那估计是高手才能编写啊!那怎么办呢?眼看一星期的交货期要到了,由于本人从来没有写过SDK开发包,心里那个着急啊,赶紧想出了三种处理方案。

二、方案

方案一:

用自己最熟悉的Qt来写,毕竟Qt也是C++的一种嘛,应该可以和VC通用的。初步实验,你妹啊,调用不起来,直接废弃。

方案二:

找VC高手,自己掏钱出来找人写,客户是上帝,那可不能耽误呢!各大群里发消息,无奈高手要价太高(一个简单的socket通信封装,协议都有,熟手估计半天,要价8K有点高),绝大部分答话者使用.NET和JAVA语言,这个编写DLL肯定不大适合,你想想提供个DLL还要客户安装个框架,情何以堪!话说众里寻他千百度啊,我一个亲戚就是专门搞VC开发12年啦,这点程序半天就可以搞定的,找到之后,时间有限太忙了,没时间写,郁闷!再次放弃!~

方案三:

时间一分一秒过去,真心着急啊,难不成自己用VC编写?有想法就赶紧行动,找到了古董级别的VS6.0的安装光盘,双击看到阔别七年的安装界面,突然之间有种热泪盈眶的感觉。老朋友啊,当年的编程入门,又记起了当年的大学,当年的图书馆,当年的初恋!

c10284e030428989cceeece8ae698547.png

搞就搞,新建MFC DLL,我的妈呀,VC的命名规则实在让人抓狂!半自动语法提示更是让我有种自杀的冲动!安装了visualAssistX,还是不爽!话说编程也要带着快乐的心情嘛,所以果断放弃!

怎么办呢?既然Qt也是C++,而且有个大名鼎鼎的WPS都是Qt和MFC混合编程的,所以肯定有方法的,百度谷歌,找到一个qtwinmigrate的东西,在这里万分感谢qtwinmigrate的作者!

好吧,参考里面的例子,正式开始编写了,咱就先来一个最初级的吧。

三、步骤

第一步:

打开qt creator,新建C++ 库项目

依次下一步,记得在选择需要的模块的时候选择QtGui模块,如果没有选中的话,后面编译通不过,qmfcapp这个类里面用了QtGui模块中的方法。

ad9f29354d9ba430e34877a36b798028.png

第二步:

将多余的文件删除,_global.h还有其他两个文件删除,因为这是Qt新建DLL自带的,我们要写的是可以供其他语言调用的DLL,我这里的例子是只用了一个函数和事件,没有用到界面的东西,所以从qtwinmigrate下面的src文件夹拷贝qmfcapp.h和qmfcapp.cpp这两个文件过来即可,如下。

ba89fe30eee0f746e66908f2926d846a.png

第三步:

更改pro文件,改为

TARGET = qtdllTEMPLATE = libCONFIG += dll SOURCES +=  qmfcapp.cpp  main.cpp HEADERS +=qmfcapp.h

main.cpp代码如下

#include "qmfcapp.h"#include "windows.h" //windows下DLL函数入口BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpvReserved ){ static bool ownApplication = FALSE;  if ( dwReason == DLL_PROCESS_ATTACH ) ownApplication = QMfcApp::pluginInstance( hInstance ); if ( dwReason == DLL_PROCESS_DETACH && ownApplication ) delete qApp;  return TRUE;} //定义函数回调指针typedef void (CALLBACK *FunCallBack)(int par);//定义回调函数FunCallBack OnEvent=NULL;//定义回调参数int par; //定义C语言类型导出事件函数extern "C" __declspec(dllexport) void SetFunCallBack(FunCallBack fun,int p){ OnEvent=fun; par=p;} //定义C语言类型导出函数extern "C" __declspec(dllexport) int add(int i){ //下面这段代码用来触发事件,如果仅仅是使用add函数的话可以删除. if (i==110){ if (OnEvent){ //当传入参数为110而且已经定义过回调函数的话,则触发事件. OnEvent(120); } }  return i*2;}

选择release编译,在目录下生成了一个DLL文件,这个文件就可以供VC/C#/VB/JAVA等调用了。

第四步:编写VC和C语言程序测试

main.c代码如下:

#include #include  //定义函数指针typedef int (*Add)(int);//定义回调函数指针typedef void (CALLBACK *FunCallBack)(int); //定义回调函数处理方法void CALLBACK HandleEvent(int par){printf("%d

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

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

相关文章

求二叉树高度_LeetCode刷题——第二十五天(平衡二叉树)

这段时间跟二叉树杠上了,接下来还有许多二叉树的题目,虽然已经做了不少了,大多题目都涉及到了递归,也挺好,刚好有机会练习一下递归,但是遇到新的题目还是有点力不从心,还需要看参考答案&#xf…

IOC操作Bean管理注解方式(组件扫描配置)

IOC操作Bean管理注解方式&#xff08;组件扫描配置&#xff09; 开启组件扫描的 细节配置 约定那些类可以扫描&#xff0c;哪些类不可以扫描 bean1.xml配置如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://w…

rabbitmq 持久化_RabbitMQ原理与相关操作(三)消息持久化

现在聊一下RabbitMQ消息持久化&#xff1a;问题及方案描述1.当有多个消费者同时收取消息&#xff0c;且每个消费者在接收消息的同时&#xff0c;还要处理其它的事情&#xff0c;且会消耗很长的时间。在此过程中可能会出现一些意外&#xff0c;比如消息接收到一半的时候&#xf…

视图的数据存放在哪里_分布式 | DBLE 是如何实现视图的?

作者&#xff1a;苏仕祥浩鲸科技 PaaS 组件团队成员&#xff0c;长期从事分库分表中间件的相关解决方案工作&#xff0c;热爱技术&#xff0c;乐于分享。本文来源&#xff1a;原创投稿*爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并…

IOC操作Bean管理注解方式(注入属性@Autowired和Qualifier)

目录 IOC操作Bean管理注解方式&#xff08;注入属性Autowired、Qualifier和Resource&#xff09; 1.基于注解方式实现 属性注入 &#xff08;1&#xff09;Autowired&#xff1a;根据属性类型进行自动装配 第一步&#xff1a; 第二步&#xff1a; &#xff08;2&#xff…

python数据可视化的特点_6 种 Python 数据可视化工具

原标题&#xff1a;6 种 Python 数据可视化工具 英文&#xff1a;Chris Moffitt&#xff0c;编译&#xff1a;伯乐在线/李加庆 简介 在 Python 中&#xff0c;将数据可视化有多种选择&#xff0c;正是因为这种多样性&#xff0c;何时选用何种方案才变得极具挑战性。本文包含了一…

IOC操作Bean管理注解方式(完全注解开发)

IOC操作Bean管理注解方式&#xff08;完全注解开发&#xff09; &#xff08;1&#xff09;创建配置类&#xff0c;替代xml配置文件 需要让Spring 把一个普通的类认为是配置类 结构图&#xff1a; SpringConfig类代码如下&#xff1a; package com.lbj.spring5.comfig;import …

Spring的AOP-基本概念

AOP-基本概念 Aspect Oriented Programming&#xff1a;面向切面编程&#xff0c;利用AOP 可以对业务逻辑的各个部分进行隔离。从而使得业务逻辑各部分之间的 “ 耦合度降低 ” 通俗解释&#xff1a;在不修改原有代码的情况下增加功能而不影响原有功能&#xff0c;在主干功能里…

为什么python打不开_python文件打不开如何解决

python中打开文件使用的是open()函数&#xff0c;获取文件对象&#xff0c;之后的操作都是相对于文件对象而言的。f open(your_file.txt,r) 就可以打开一个文件进行操作。第二个参数为对文件的操作方式&#xff0c;’w’是写文件&#xff0c;已存在的同名文件会被清空&#xf…

Spring的AOP-底层原理

目录 1.有两种动态代理 第一种&#xff1a;有接口情况&#xff0c;使用JDK动态代理 第二种&#xff1a;无接口情况&#xff0c;使用CGLIB动态代理 2.使用JDK动态代理&#xff0c;使用Proxy类里面的方法创建代理对象 步骤一&#xff1a; 步骤二&#xff1a; 步骤三&#…

screnc加密后文件不能执行_芯片加密后还能不能再次使用【详细介绍】

随着信息技术的发展&#xff0c;信息的载体-芯片的运用也越来越多了&#xff0c;随之而来的芯片安全性的要求也越来越高了&#xff0c;各个芯片厂商对芯片保密性要求越来越高&#xff0c;芯片的加密&#xff0c;保证了芯片中的信息的安全性。经常有客户打电话过来问&#xff0c…

Spring的AOP-操作术语

目录 Spring的AOP-操作术语 1.连接点 2.切入点 3.通知 &#xff08;1&#xff09;实际增强的逻辑部分称为通知 &#xff08;2&#xff09;通知有多种类型 4.切面 Spring的AOP-操作术语 1.连接点 类里面那些方法可以被增强&#xff0c;这些方法称为连接点 2.切入点 类里…

向别人网页注入js_区块链研究实验室 | Web3 .js基于以太坊的Javascript API

web3.js是一个库集合&#xff0c;你可以使用HTTP或IPC连接本地或远程以太它节点进行交互。 web3的JavaScript库能够与以太坊区块链交互。 它可以检索用户帐户&#xff0c;发送交易&#xff0c;与智能合约交互等。Version : 1.0.0-beta.36Web3.js API类型eth&#xff1a;Etherum…

Spring的AOP-准备工作

目录 Spring的AOP-准备工作 1.Spring框架一般基于 AspectJ 实现AOP操作 2.基于AspectJ 实现 AOP 操作 &#xff08;1&#xff09;基于xml 配置文件实现 &#xff08;2&#xff09;基于注解方式实现【常用】 3.在项目工程用引入AOP 相关依赖 步骤一&#xff1a;找到依赖包…

Spring的AOP-AspectJ注解方式

目录 Spring的AOP-AspectJ注解方式 1.创建类&#xff0c;在类里面定义方法 2.创建增强类 3.进行通知的配置 &#xff08;1&#xff09;在Spring 配置文件中&#xff0c;开启直接扫描 &#xff08;2&#xff09;使用注解创建User 和 UserProxy 对象 &#xff08;3&#x…

python turtle绘制柱状图_python绘制图形(Turtle模块)

用python的Turtle模块可以绘制很多精美的图形&#xff0c;下面简单介绍一下使用方法。 需要用到的工具有python&#xff0c;python 的安装这里就不再细说。自行搜索。 from turtle import * #引入turtle模块 color(red, yellow) #设置绘制的颜色和填充颜色 # 海龟设置 hideturt…

JdbcTemplate(概念和准备)

目录 1.什么是jdbcTemplate 2.使用前准备工作&#xff1a; &#xff08;1&#xff09;引入相关jar包 &#xff08;2&#xff09;在spring 配置文件配置数据库连接池​ &#xff08;3&#xff09;配置jdbcTemplate 对象&#xff0c;注入 DataSource &#xff08;4&#xf…

python shape函数_Python中的多态及抽象类

本书同名免费MOOC《Python编程基础及应用》在哔哩哔哩(B站)热播&#xff0c;作者带着你学。版权声明&#xff1a;本文内容引用自作者的图书《Python编程基础及应用》(高等教育出版社)。本文可以在互联网上转载传播&#xff0c;但必须包含文中的版权声明&#xff1b;本文不可以以…

JdbcTemplate(操作数据库-添加功能)

目录 JdbcTemplate&#xff08;操作数据库-添加功能&#xff09; 1.建立数据库表&#xff1a; 2.对应数据库创建实体类&#xff1a; 3.编写service 和 dao &#xff08;1&#xff09;在 dao 层进行数据库添加操作 &#xff08;2&#xff09;具体&#xff1a;调用jdbcTemp…

JdbcTemplate(操作数据库-修改和删除功能)

目录 JdbcTemplate&#xff08;操作数据库-删除功能&#xff09; 1.创建数据库 2.配置文件实现 3.创建实体类 4.创建dao层 5.创建service层 6.测试类 7.测试结果&#xff1a; JdbcTemplate&#xff08;操作数据库-删除功能&#xff09; 1.创建数据库 user_db数据库的t_…