QT(56)-动态链接库-windows-导出变量-导出类

news2025/4/4 2:58:25

 1.导出变量
     1.1不使用_declspec(dllimport)+ _declspec(dllexport)
     
      使用_declspec(dllimport)+ _declspec(dllexport)
      1.2
win32 mydll+win32 myexe
      1.3win32 mydll+qt myexe
 2.导出类
   使用_declspec(dllimport)+ _declspec(dllexport)
   
2.1不用关键字
    2.2 用关键字win32 mydll+ QT myexe
    2.3 用关键字QT mydll+ QT myexe


1.导出变量( 全局变量+ 静态变量)
   方式:.def +dll
   1.1不使用_declspec(dllimport)+ _declspec(dllexport) 

     1.111mydll 编写 项目创建: DLL
     1.112win32 mydll.cpp

int gdllvar=888;

   1.113win32 mydll.def

LIBRARY
EXPORTS
gdllvar CONSTANT

    1.121myexe编写
     1.1211配置dll,lib,h
   配置dll路径:链接器->附加库目录

配置lib文件:链接器->输入

 1.1212myexe.cpp编写
   取的是DLL中变量的地址,而非值。
   不能 gdllvar=100; 这样修改的是地址。

extern int gdllvar; //DLL中的全局变量的地址
int main()
{
   int myvar=gdllvar; //调用DLL中的全局变量 不行
   int myvar= *(int *)gdllvar;
}

   1.12 使用 _declspec(dllimport)+ _declspec(dllexport)
       取的是DLL中变量,改的也是值。
      myexe.cpp

# pragma comment(lib,"..\\Debug\\mydll.lib")
extern int _declspec(dllimport) gdllvar;
int main()
{
  int myvar =gdllvar;   //这就是对原dll文件中的值进行操作。
}

  1.2win32 mydll+win32 myexe
     1.211 win32 mydll 新建项目设置为DLL
     
1.212 win32 mydll h文件  

#ifdef  INDLL
#define  SPEC  _declspec(dllexport)
#else
#define  SPEC  _declspec(dllimport)
#endif 
extern  "C"
{
	SPEC  extern int gdllvar1;  //声明要导出的全局变量
	SPEC  extern  int gdllvar2;  //声明要导出的全局变量
}

 1.213 win32 mydll cpp文件

#include "stdafx.h"
#ifndef INDLL
#define INDLL
#endif

#include "mydll.h"
int gdllvar1=88,gdllvar2=99;

1.22 win32 myexe cpp文件

# include "../mydll/mydll.h"
#pragma comment(lib,"../debug/mydll.lib")

int main()
{
int myvar1=gdllvar1;
int myvar2=gdllvar2;
}

1.3 win32 mydll+qt myexe
   
1.31 win32 mydll
        1.311  win32 mydll h文件
        1.312  win32 mydll cpp文件
    1.32 qt myexe
        1.321 qt myexe win32API函数调用       

void Dialog::on_pushButton_clicked()
{
 DWORD dw;
   HINSTANCE hDLL; // 1.Handle to DLL
   int n;
   int *pgdllvar; // Function pointer
   QString str;

   hDLL = ::LoadLibrary(L"mydll.dll"); //注意有个L
   if (hDLL)
   {
       pgdllvar = (int*)GetProcAddress(hDLL,"gdllvar");//得到导出变量的实际地址
       if (!pgdllvar)
       {
           // 处理错误情况
           dw = ::GetLastError();
           FreeLibrary(hDLL);
           str.sprintf("GetProcAddress failed:%d",dw);
           QMessageBox::information(this,"Error code",str);
       }
       else
       {
           n = *pgdllvar;//存放到整型变量n中
           str.sprintf("%d",n);
           QMessageBox::information(this,"result",str);
          FreeLibrary(hDLL); //释放句柄
       }
   }
   else
   {
       dw = ::GetLastError();
       str.sprintf("Load dll failed:%d",dw);
       QMessageBox::information(this,"Error",str);
   }
}

   1.322 qt myexe QLibrary函数调用

void Dialog::on_pushButton_clicked()
{
    int n,*pn;
    QString str;

    QLibrary lib("Test");
   if(lib.load())
    {
      pn = (int *)lib.resolve("gdllvar");
      if (!pn)
      {
          // 处理错误情况
          QMessageBox::information(this,"Error","resolve failed");
      }
      else
      {
         n=*pn;
         str.sprintf("%d",n);
         QMessageBox::information(this,"result",str);
      }
    }
    else  QMessageBox::information(this,"Error","load failed");
}

1.4  win32 mydll
       1.411新建项目DLL
       1.412 mydll.h         

#pragma once
#ifdef  INDLL
#define  SPEC  _declspec(dllexport) 
#else
#define  SPEC  _declspec(dllimport)
#endif 


class SPEC CMath
{
public:
	CMath();
	virtual ~CMath();
public:
	static double  PI; //定义一个类静态变量
};

   1.413mydll.cpp

#include "stdafx.h"

#define INDLL //这样定义后,Test.h中的SPEC为_declspec(dllexport)
#include "mydll.h"

CMath::CMath() {}
CMath::~CMath() {};

double CMath::PI = 3.14; //对类静态变量赋值

   1.5win32 myexe
    1.51 myexe.cpp

#include "pch.h"
#include <stdio.h>
#include "../mydll/mydll.h"
#pragma comment(lib,"../debug/mydll.lib")
int main()
{
	printf("%f\n", ++CMath::PI); //先让类静态变量自加,然后打印结果
	return 0;
}

2.导出类  用关键字和不用关键字两种

2.1不用关键字:
     设置:项目->属性->生成MAP文件
     生成lib,dll,map  
map中类函数

  

win32 myexe.cpp

#include "stdafx.h"
#include "../mydll/mydll.h"
#pragma comment(lib,"../debug/mydll.lib")
int _tmain(int argc, _TCHAR* argv[])
{
	CMath math;
	printf("%d,%d\n", math.Add(10, 8), math.sub(20,3));

	return 0;
}

 2.2用关键字 win32 mydll+ QT myexe
   
2.211 win32:mydll.h
    
2.212 win32 :mydll.cpp

#include "stdafx.h"
#include "Test.h"

int CMath::Add(int a, int b)
{
	return a + b;
}
int CMath::sub(int a, int b)
{
	return a - b;
}
CMath::CMath(){}
CMath::~CMath(){}

  2.213 QT :myexe.cpp

class  CMath
{
public:
    int Add(int a, int b);
    int sub(int a, int b);
    ~CMath();
    CMath();
};
void Dialog::on_pushButton_clicked()
{
    CMath math;
    QString str;
    int c= math.Add(2,3);
    str.sprintf("%d",c);
    QMessageBox::information(this,"result",str);
}

 2.214 QT  :myexe.pro

LIBS += -L$$PWD/ ./ -lmydll

2.3用关键字 QT mydll+ QT myexe
   
创建项目 C++库:

   2.31QT mydll.h

#ifndef MYDLL_H
#define MYDLL_H

#include "mydll_global.h"
extern "C"
{
 MYDLL_EXPORT int add(int a ,int b);  //宏定义表示是导出函数
}

class MYDLL_EXPORT Mydll
{
public:
    Mydll();
};

#endif // MYDLL_H


   2.32QT mydll.cpp
 

#include "mydll.h"

Mydll::Mydll()
{
}
int add(int a,int b)
{
    return a+b;
}




   2.33 QT myexe.h
   2.33 QT myexe.cpp

 

#include "dialog.h"
#include "ui_dialog.h"
#include <QMessageBox>

extern "C"
{
    int add(int a ,int b);
}



Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    ui->setupUi(this);
}

Dialog::~Dialog()
{
    delete ui;
}

void Dialog::on_pushButton_clicked()
{
    QString str;
    int sum = add(2,3);
    str.sprintf("sum=%d",sum);
    QMessageBox::information(this,"rsult",str);
}


  

 

 

 

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

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

相关文章

导出Excel表格(调用后端接口方式)

在开发中我们会遇到导出Excel表格的需求&#xff0c;但是导出分为前端生成和后端生成。前端生成的方式CSDN其他小伙伴已经做出了很多教程&#xff0c;是依赖xlsx插件。但是&#xff0c;今天我讲的是&#xff0c;调用后端接口的方式生成Excel表格。1.调用后端提供的导出接口&…

Doris--简单使用

一、数据表的创建与数据导入 1.1、创建表 1.1.1、单分区 CREATE TABLE table1 (siteid INT DEFAULT 10,citycode SMALLINT,username VARCHAR(32) DEFAULT ,pv BIGINT SUM DEFAULT 0 -- 聚合模型&#xff0c; value column 使用sum聚合 ) AGGREGATE KEY(siteid, citycode, …

【Java】二叉树

一、树形结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。它具有以下的特点&#xff1a; 有一个特殊…

IDEA安装ChatGPT插件

ChatGPT&#xff0c;美国OpenAI [1] 研发的聊天机器人程序 [12] &#xff0c;于2022年11月30日发布 [2-3] 。ChatGPT是人工智能技术驱动的自然语言处理工具&#xff0c;它能够通过学习和理解人类的语言来进行对话&#xff0c;还能根据聊天的上下文进行互动&#xff0c;真正像人…

mybatis条件构造器(一)

mybatis条件构造器(一) 1 准备工作 1.1 建表sql语句(Emp表) SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for emp -- ---------------------------- DROP TABLE IF EXISTS emp; CREATE TABLE emp (EMPNO int NOT N…

tws耳机哪个牌子音质好?tws耳机音质排行榜

随着蓝牙耳机市场的不断发展&#xff0c;使用蓝牙耳机的人也逐渐增多&#xff0c;近年来更是超越有线耳机成为最火爆的数码产品之一。那么&#xff0c;tws耳机哪个牌子音质好&#xff1f;下面&#xff0c;我来给大家推荐几款音质好的tws耳机&#xff0c;可以当个参考。 一、南…

vb 模块和作用域的关系

模块在VB中有三种类型的模块&#xff0c;分别是窗体模块、标准模块和类模块。窗体模块窗体模块中包含了窗体以及窗体中所有控件的事件过程&#xff0c;文件扩展名为&#xff08;*.frm)&#xff0c;窗体文件中不仅包含窗体对象的外观设计&#xff0c;也包含窗体模块&#xff08;…

基于matlab评估星载合成孔径雷达性能

一、前言本示例展示了如何评估星载合成孔径雷达 &#xff08;SAR&#xff09; 的性能&#xff0c;并将理论极限与 SAR 系统的可实现要求进行比较。SAR利用雷达天线在目标区域上的运动来提供更精细的方位角分辨率。给定雷达的主要参数&#xff08;例如工作频率、天线尺寸和带宽&…

Nginx配置Https协议(告别Http协议,使用Https)图

注&#xff1a; 相关代码&#xff1a;Linux部署Nginx&#xff08;快速&#xff09;_Dyansts的博客-CSDN博客 视频教程 &#xff1a;6分钟告别http协议&#xff0c;使用更加安全的https协议_哔哩哔哩_bilibili 细节 免费申请ssl网站&#xff1a;FreeSSL首页 - FreeSSL.cn一…

OpenShift 4 - 将 VMware 虚机迁移至 OpenShift Virtualization(视频)- 冷迁移

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证 文章目录环境说明OpenShift Virtualization 环境VMware vSphere 环境了解 Migration Toolkit for Virtualization安装 Migration Toolkit for Virtualizati…

教你使用内嵌chatGPT的新必应(bing)

巨头们的AI战愈演愈烈起来。在谷歌公布其 ChatGPT 竞品Bard后的第二天&#xff0c;微软就官宣了两款新的 AI 产品&#xff1a;基于下一代 OpenAI 大型语言模型上的新版 Bing 搜索引擎&#xff0c;号称“比 ChatGPT 更强大”&#xff0c;以及基于 AI 功能的改进版 Edge 网络浏览…

在 Flutter 中使用 webview_flutter 4.0 | js 交互

大家好&#xff0c;我是 17。 已经有很多关于 Flutter WebView 的文章了&#xff0c;为什么还要写一篇。两个原因&#xff1a; Flutter WebView 是 Flutter 开发的必备技能现有的文章都是关于老版本的&#xff0c;新版本 4.x 有了重要变化&#xff0c;基于 3.x 的代码很多要重…

亲历华为手机丢失通过定位找回

我有个华为Meta 40E手机&#xff0c;用了一年半左右。前天&#xff0c;也就是周六上午去小区超市买菜&#xff0c;顺便遛遛狗。 回来的路上在红色的步行道&#xff0c;可乐和糯米&#xff08;我家养的两只边牧犬&#xff09;看到前面不远处有几只流浪的小狗&#xff0c;就叫着…

如何查询IPv4归属地信息呢?

想查询IPv4归属地&#xff0c;首先要知道自己的IP地址是什么。下面&#xff0c;我将介绍IP地址查询方法和IPv4归属地查询方法。一、查局域网IP地址方法第一种方法&#xff1a;通过命令行窗口获取内网IP地址1.打开命令行窗口。使用开始菜单中的搜索功能搜索“cmd ”,并以管理员身…

Pytorch复习笔记--torch.nn.functional.interpolate()和cv2.resize()的使用与比较

1--前言 博主在处理图片尺度问题时&#xff0c;习惯使用 cv2.resize() 函数&#xff1b;但当图片数据需用显卡加速运算时&#xff0c;数据需要在 GPU 和 CPU 之间不断迁移&#xff0c;导致程序运行效率降低&#xff1b; Pytorch 提供了一个类似于 cv2.resize() 的采样函数&…

国际化语言,多语言三种方式

可以用透传的方式&#xff0c;自己写local的json文件&#xff0c;不需要配置什么&#xff0c;直接传&#xff0c;自己写方法i18n nextjsi18n umi4一、透传的方式 export const AppContext React.createContext<any>({})app.tsx 用context包裹import type { AppProps } f…

如何通过自己编写Jmeter函数

在Jmeter的函数助手里&#xff0c;有很多内置的函数&#xff0c;比如Random、UUID、time等等。使用这些函数可以快速帮我们生成某些数据&#xff0c;进行一些逻辑处理。用起来非常的方便。 但是在实际接口测试过程中&#xff0c;有很多的需求&#xff0c;Jmeter内置的函数可能…

【自制开发板】自制STM32F407开发板(含TFT 8080串口屏幕接口)

【2023 年 2 月 14 日】 许久没有更新&#xff0c;最近做了个小开发板玩了玩。更新一下吧&#xff0c;作为记录&#xff01;&#xff01; 主要是象试一下LVGL在STM32上的应用&#xff0c;所以开发板的大小都是基于屏幕大小来设计的。 分享出来&#xff0c;给大家一个板子结构…

SpringBoot Mybatis 分页实战

pageInfo的属性 pageNum&#xff1a;当前页 pageSize&#xff1a;页面数据量 startRow&#xff1a;当前页首条数据为总数据的第几条 endRow&#xff1a;当前页最后一条数据为总数据的第几条 total&#xff1a;总数据量 pages&#xff1a;总页面数 listPage{}结果集 reasonable …

ESP-C3入门8. 连接WiFi并打印信息

ESP-C3入门8. 连接WiFi并打印信息一、ESP32 连接WiFi的基本操作流程1. 初始化nvs存储2. 配置WiFi工作模式3. 设置WiFi登陆信息4. 启动WiFi5. 开启连接6. 判断是否成功二、事件处理函数1. 定义事件处理函数2. 创建事件组3. 在事件处理函数中设置事件组位4. 在其他任务中等待事件…