当前位置: 首页 > news >正文

QT 开发COM(ActiveX)组件基础介绍和方案验证

一、COM简介

1.1 COM是什么?

COM,Component Object Model,即组件对象模型,是一种以组件为发布单元的对象模型,这种模型使各软件组件可以用一种统一的方式进行交互。COM 既提供了组件之间进行交互的规范,也提供了实现交互的环境,因为组件对象之间交互的规范不依赖于任何特定的语言,所以,COM也可以是不同语言协作开发的一种标准。

COM实际上是一种组件标准,COM不仅仅提供了组件之间的接口标准,它还引入了面向对象的思维。在COM标准中,对象是一个非常活跃的元素,常常被称为COM对象。组件模块为COM对象提供了活动的空间,COM对象以接口的方式提供服务,这种接口就被称为COM接口。COM组件、COM对象、COM接口三者的关系如下图所示:

在Windows系统平台上,一个COM组件可以是一个DLL(Dynamic Linking Library,动态链接库)文件,也可以是一个EXE(可执行程序)文件。一个组件程序可以包含多个COM对象,并且每个COM对象可以实现多个接口。

当另外的组件或者普通程序(即组件的客户程序)调用组件的功能时,它首先创建一个COM对象或者通过其他途径获得COM对象,然后通过该对象所实现的COM接口调用它所提供的服务。当所有的服务结束之后,如果客户程序不再需要该COM对象,那么它就应该释放掉对象所占用的资源,包括对象自身。

1.2 COM接口与API之间的区别

COM接口和经常说的API有点相似。通过API接口层,可以很好地把两个程序连接起来,但存在一些问题:1)、当API非常多时,使用会非常不方便,需要对函数进行组织。2)、API函数需要标准化,按照统一的调用方式进行处理,以适应不同编程语言的实现,包括参数传递顺序、参数类型、函数返回处理都需要标准化。而COM定义了一套完整的接口规范,不仅可以弥补以上API作为组件接口的补足,还充分发挥了组件对象的优势,并实现了组件对象的多态性。

1.3 .NET组件和COM组件的区别

.NET组件和COM组件之间的主要区别在于它们的设计目标、实现方式和运行环境。.NET组件是微软推出的新一代编程模型,用于构建Web应用、桌面应用和移动应用;而COM组件是Windows操作系统中基于二进制代码通信的机制,主要用于实现Windows系统中的各种组件之间的互操作。.NET组件和COM组件在实现方式、编程语言和运行环境上有所不同。

实现方式:

.NET组件:通过C#、VB.NET等.NET编程语言编写,以.NET框架为基础,运行在.NET运行时(CLR)上。

COM组件:通过C++、VB6等编程语言编写,以COM为基础,运行在COM运行时上。

编程语言:

.NET组件:使用C#、VB.NET等.NET编程语言编写,可以跨平台运行。

COM组件:使用C++、VB6等编程语言编写,只能在Windows操作系统中运行。

运行环境:

.NET组件:运行在.NET运行时(CLR)上,支持多语言、跨平台、面向对象和类型安全等功能。

COM组件:运行在COM运行时上,支持多语言、跨平台、面向对象和类型安全等功能。

生命周期:

.NET组件:具有短暂的生命周期,一旦被加载到内存中,就可以立即运行。

COM组件:具有较长的生命周期,需要经过加载、注册、卸载等步骤,需要更多的手动管理。

安全性:

.NET组件:提供了内存管理和类型安全等功能,可以避免缓冲区溢出等安全问题。

COM组件:由于手动管理,容易出现缓冲区溢出等安全问题。

总的来说,.NET组件和COM组件在设计目标、实现方式和运行环境上有所不同,但它们都是用于构建Windows应用程序的组件化编程模型。

因此COM组件并不依赖于.NET Framework的运行环境。

但两者之间是可以相互调用,见如下文章:

COM 互操作示例:.NET 客户端和 COM 服务器 - .NET Framework | Microsoft Learn

1.4 类厂

在创建组件对象时,客户程序调用COM库中的函数进行组件对象的创建工作,COM库的创建函数根据注册表的信息并调用组件程序的入口函数来创建组件对象。所以组件程序需要提供一个标准的入口函数 DllGetObjectClass 函数,用于提供本组件的组件信息。而在 DllGetObjectClass 中,是以类厂的方式获取组件对象的。

类厂,顾名思义,就是COM类的工厂。如果对C++比较熟悉的话,应该会知道设计模式中的工厂设计模式,其实这个类厂的概念就和工厂设计模式很相似。确切的说,类厂应该成为“对象厂”,因为类厂是COM对象的生产基地,COM库通过类厂创建COM对象;COM规定,每一个COM类,对应的都要有一个类厂专门用于该COM类的对象的创建工作。

如果一个组件程序实现了多个COM对象类,则相应的有多个类厂。所以,上述关于字典组件的结构、和多个类厂的结构就如下所示:

1.5 COM库

COM除了定义了组件程序和客户程序交互的规范以外,它也提供了COM的实现部分即COM库,使得这些规范能够真正地应用起来。并且COM库也充当了组件程序和客户程序之间的桥梁,尤其是在组件对象的创建过程中,以及在对象管理、内存管理和一些标准化操作方面起着重要的作用。

COM库的一些常用函数:

客户程序调用COM库创建组件对象的顺序图:

1.6 COM实现过程

COM客户程序、COM库、COM组件程序三者之间的协作过程

1.7 QTActiveX介绍

Qt提供了QtActiveX模块来支持微软ActiveX的开发,Qt的ActiveX和COM的开发支持两种方式:

支持将已有的COM或者ActiveX空间引入到Qt的应用程序中

支持将Qt应用程序或者Qt的对象导出成COM对象或者ActiveX控件供他人使用

具体来说,Qt是通过ActiveXQt框架中的两个模块来支持上述所说的两种方式的:

使用QAxContainer模块,通过QAxObject和QAxWidget分别支持COM对象和ActiveX控件的开发,可以通过这两个对象将外部的COM或者ActiveX组件接入到Qt应用程序

使用QAxServer模块,通过QAxAggregated、QAxBindable和QAxFactory类,通过了进程内和可执行程序exe两种方式的COM Server模式,用来将Qt写的内容导出为COM或者ActiveX供他人使用。

二、基于VS+QT开发Com组件

Qt的windows商业版本提供了ActiveQt这个framework,使用这个组件我们可以在Qt中使用ActiveX控件,并且也开发基于Qt的ActiveX控件。

开源版本是没有的,需要依赖于VS的QT插件来做开发。

2.1 环境配置

2.1.1 VS+QT+vsaddin插件安装

操作参考:

QT - QT中配置MSVC编译环境 以及 VS中配置QT开发环境_qt msvc-CSDN博客

本次最终采用QT6.7 + VS2022版本。

2.1.2 安装相关问题

1.QT安装速度提升,避免各种网络超时报错:

安装QT时,更换镜像源,以带参数的方式启动:

.\qt-unified-windows-x64-4.4.2-online --mirror https://mirrors.tuna.tsinghua.edu.cn/qt

2.VS、QT、MSVC、qtaddin版本对应问题

下载qtaddin插件,与对应VS20xx版本对应即可。

QT5.12.12不支持MSVC2019,最高支持到MSVC2017

QT5.15.2可支持到MSVC2019,但是当前没有离线包的版本,在线安装也不支持;

QT6.x可支持到MSVC2022

MSVC20xx 一般要与对应的VS20xx相对应(参考的两篇文章分别都是对应的)

因此QT所支持的MSVC版本,一般需要跟VS20xx对应起来。

网上成功的:

QT5.15.2 + MSVC 2019 + VS2019

QT5.14.2 + MSVC 2017 + VS2017 

自测:

QT6.7 + MSVC2019 + VS2019  ,新建activex项目,点击生成各种报错,未找到有效解决方案;

QT5.14.2 + MSVC2017 + VS2017,但VS 2017的winform项目,看不到生成的com组件……

QT5.14.2 + MSVC2017 + VS2017(负责生成COM) + VS2022(C#负责调用com),预览界面可以看到组件UI,实际运行显示不了;并且VS2017生成com有不稳定的情况,后续编译不了了……

最终测试版本成功:

QT6.7 + MSVC2019 + VS2022 + QTaddin3.2

注意点:先用IE模式,用html测试生成的Activex控件可用,随后再用winform项目做测试,会好一些。

3. idl报错,生成出现错误“MSB3073”  

  需要使用管理员权限打开VS202软件。

4.ActiveQt/QAxBindable 找不到源文件

安装QT时,ActiveQT组件一定要安装,不然会出现项目找不到active相关头文件的问题:

要修改已有的qt组件,运行QT安装目录下的工具即可:

MaintenanceTool.exe

5."QtWidgets/QWidget”找不到源文件

VS2019 + Qt5.12 配置完成后,无法打开 Qt 源文件解决方案(非常实用)_无法打开qbuttongroup源文件-CSDN博客

2.2 COM(ActiveX)组件开发

QT - QT中的COM编程(dll进程内组件形式)_qt com组件-CSDN博客

2.2.1 实际代码

ActiveQtServer1.h
#pragma once#include <QtWidgets/QWidget>
#include <ActiveQt/QAxBindable>#include "ui_ActiveQtServer1.h"class ActiveQtServer1 : public QWidget, public QAxBindable
{Q_OBJECTpublic:ActiveQtServer1(QWidget *parent = nullptr);public slots://定义两个槽函数,便于外部调用QString getVersion();QString getCurrentTime();private:Ui::ActiveQtServer1Class ui;
};
ActiveQtServer1.cpp
#include "ActiveQtServer1.h"
#include <ActiveQt/QAxFactory>ActiveQtServer1::ActiveQtServer1(QWidget *parent): QWidget(parent)
{ui.setupUi(this);
}
QAXFACTORY_DEFAULT(ActiveQtServer1,"{c5e4017e-73a4-47c2-ad5d-aba20c13a6ba}","{4c7d8024-69c9-4377-8a73-f163a00ad8d8}","{c46481e5-2702-476c-9cb2-e8dca9a23a47}","{484c7403-d8fa-4d7d-ac12-b75f20d6e60b}","{a3dd71cf-f57e-49ef-a6c3-939b4d2e7339}"
)
QString ActiveQtServer1::getVersion() {return "0.0.1";
}
QString ActiveQtServer1::getCurrentTime() {return ui.calendarWidget->selectedDate().toString();
}

2.2.2 生成dll

需要以管理员模式运行VS,才能够正常生成和注册:

2.2.3 发布(需要通过windeploy发布依赖的文件

 D:\Qt\Qt5.12.12\5.12.12\winrt_armv7_msvc2017\bin\windeployqt.exe .\ActiveQtServer1.dll

2.2.3 IE模式 Html测试

从注册表查询classid

编写html文件,替换classid,保存到本地(可以任一目录)

<html>
<head>
<title>activeQtDemo</title>
</head>
<body><object id="233432" width="80%" height="80%"classid="CLSID:869BDCDE-E935-432D-AC52-F66C8F1D27DD"> <PARAM NAME="_Version" VALUE="65536"><!-- 以下为入坑了 --><!--    classid="2F12BFB8-137D-4DC2-9A93-634EFE5A6DFC">  1D991CF8-6F9D-4574-9507-B526D699F4321D991CF8-6F9D-4574-9507-B526D699F432-->  [Object not available! Did you forget to build and register the server?]</object>
</body>
</html>

edge浏览器配置白名单,支持IE模式(需要支持Activex的浏览器)

通过IE浏览器打开:

点击允许加载插件

2.2.4 更新Com组件:重新生成*.dll无法打开问题

查看占用进程:

dllhost.exe对应进程kill

devenv.exe 对应VS winform调用方关掉工程即可

三、QT QtWidgetApp调用COM

3.1 操作参考文章        

Qt调用Com组件--QT调用COM组件DLL(dumpCPP工具)_qt dumpcpp dll-CSDN博客

3.2 实际代码

main.cpp

#include <QApplication>
#include <QAxObject>
#include <QDebug>
#include <QFile>int main(int argc, char *argv[])
{QApplication a(argc, argv);QAxObject *mpAxObj;mpAxObj = new QAxObject();//指定调用的COM组件类ID(clsid\ClassID),这个ID要填正确,就是前面宏定义的 ClassID.mpAxObj->setControl("{c5e4017e-73a4-47c2-ad5d-aba20c13a6ba}");//导出支持调用的函数接口QString DOC = mpAxObj->generateDocumentation();QFile outFile("com_function.html");outFile.open(QIODevice ::ReadWrite|QIODevice ::Text);QTextStream TS(&outFile);TS<<DOC<<endl;//调用COM组件函数接口: 显示界面mpAxObj->dynamicCall("show()");//调用COM组件函数接口:获取版本QString result=mpAxObj->dynamicCall("getVersion()").toString();qDebug()<<"插件的版本号:"<<result;//调用COM组件函数接口:获取当前时间QString result2=mpAxObj->dynamicCall("getCurrentTime()").toString();qDebug()<<"当前时间:"<<result2;return a.exec();
}

四、VS winform调用COM

4.1 winform工程引用com组件

操作参考:

C#-winform调用COM组件(COM组件由Qt开发)-云社区-华为云

Qt开发Activex笔记(三):C#调用Qt开发的Activex控件_qt开发ocx给c#-CSDN博客

4.2 修改生成的目标平台为x64

4.3 运行最终效果

4.4 遇到的问题:

4.4.1 点击运行后,报错没有注册类

System.Runtime.InteropServices.COMException

  HResult=0x80040154

  Message=没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))

  Source=System.Windows.Forms

  StackTrace:

   at System.Windows.Forms.UnsafeNativeMethods.CoCreateInstance(Guid& clsid, Object punkOuter, Int32 context, Guid& iid)

   at System.Windows.Forms.AxHost.CreateWithLicense(String license, Guid clsid)

   at System.Windows.Forms.AxHost.CreateInstanceCore(Guid clsid)

   at System.Windows.Forms.AxHost.CreateInstance()

   at System.Windows.Forms.AxHost.GetOcxCreate()

   at System.Windows.Forms.AxHost.TransitionUpTo(Int32 state)

   at System.Windows.Forms.AxHost.CreateHandle()

   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)

   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)

   at System.Windows.Forms.AxHost.EndInit()

   at WindowsFormsApp4.Form1.InitializeComponent() in D:\VisionProject\VSWorkSpace\WinformWS\WindowsFormsApp4\WindowsFormsApp4\Form1.Designer.cs:line 64

   at WindowsFormsApp4.Form1..ctor() in D:\VisionProject\VSWorkSpace\WinformWS\WindowsFormsApp4\WindowsFormsApp4\Form1.cs:line 17

   at WindowsFormsApp4.Program.Main() in D:\VisionProject\VSWorkSpace\WinformWS\WindowsFormsApp4\WindowsFormsApp4\Program.cs:line 19

项目属性,生成的目标平台修改为x64。

4.4.2 控件已经成功添加到工具箱中,但未在活动设计器中启用

问题描述:Visual studio 2022 添加com组件到工具箱错误提示:

下列控件已经成功添加到工具箱中,但未在活动设计器中启用 ,请确认要添加的控件能够兼容当前设计器和.net framework 版本。

修改方法:

要选择上面这个Windows窗体应用(.NET Framework)

【Windows 窗体应用】的窗体属性中还有其他信息,目标框架:.NET Core 3.1

而【Windows 窗体应用(.NET Framework)】,其框架则是.NET Framework

这个.NET Core与 .NET Framework是完全不一样的东西:

  • .NET framework框架开发出来的应用只能在windows上运行。
  • .netcore 是开源的,开发出来的应用可以跨平台运行,比如运行在MAC,Linux上 。

而我们添加的COM组件,实际上是只应用于windows环境的技术,在一个非windows 的底层技术以及上层环境肯定就是不行的了。

4.4.3 引入控件报错

1.在工具箱中,拖入控件到UI中,会弹窗报错:

直接重新生成项目,也会报错:

生成的dll确实是64位的:

2.修改为x64平台(上述第二章的qt com dll也是基于x64编译的)后,编译正常,且AxActiveQTServer2Lib不再报错

五、最终代码demo

https://download.csdn.net/download/u011490813/89246081icon-default.png?t=N7T8https://download.csdn.net/download/u011490813/89246081

参考资料

COM简介

COM - COM的简单介绍_com组件结构-CSDN博客

windeployqt打包Qt应用程序(Com只注册了,还不够,需要通过windeploy发布依赖的文件):

windeployqt打包Qt应用程序_qt windeployqt 打包-CSDN博客

Qt的进程间通信,以Active服务器的形式,手把手教你VS上进行Qt的COM、ActivedQt Server的开发,比保姆还保姆

https://www.cnblogs.com/Leventure/p/16971934.html

VS+QT插件创建qt 的ActiveQT Server工程踩过的坑_qt activeqt server-CSDN博客

相关文章:

QT 开发COM(ActiveX)组件基础介绍和方案验证

一、COM简介 1.1 COM是什么&#xff1f; COM&#xff0c;Component Object Model&#xff0c;即组件对象模型&#xff0c;是一种以组件为发布单元的对象模型&#xff0c;这种模型使各软件组件可以用一种统一的方式进行交互。COM 既提供了组件之间进行交互的规范&#xff0c;也…...

[1673]jsp在线考试管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 在线考试管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…...

每日一算法

问题 等待登机的你看着眼前有老有小长长的队伍十分无聊&#xff0c;你突然 想要知道&#xff0c;是否存在两个年龄相仿的乘客。每个乘客的年龄用 1个0 到 36500 的整数表示&#xff0c;两个乘客的年龄相差 365 以内 就认为是相仿的。 具体来说&#xff0c;你有一个长度为 n 的…...

Spring Cloud Gateway直接管理Vue.js的静态资源

1. 构建Vue.js应用 像之前一样&#xff0c;构建你的Vue.js应用&#xff0c;并将生成的静态资源&#xff08;位于dist目录&#xff09;复制到Spring Boot项目的某个目录&#xff0c;比如src/main/resources/static。 2. 配置Spring Boot静态资源处理 Spring Boot默认会处理sr…...

14.集合、常见的数据结构

集合 概念 Java中的集合就是一个容器&#xff0c;用来存放Java对象。 集合在存放对象的时候&#xff0c;不同的容器&#xff0c;存放的方法实现是不一样的&#xff0c; Java中将这些不同实现的容器&#xff0c;往上抽取就形成了Java的集合体系。 Java集合中的根接口&#x…...

NLP从入门到实战——命名实体识别

1. 命名实体识别 1.1 概念 中文命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER是指识别中文文本中实体的边界和类别。命名实体识别是文本处理中的基础技术&#xff0c;广泛应用在自然语言处理、推荐系统、知识图谱等领域&#xff0c;比如推荐系统中的基于…...

接口测试工具-postman介绍

一、介绍 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。 作用:常用于进行接口测试。 它可以模拟浏览器发起任何形式的HTTP请求...

日志中看到来自User Agent go-http-client / 1.1的大量请求(go-http-client 1.1)服务器爆了

在日志中看到来自User Agent go-http-client / 1.1的大量请求 The go-http-client/1.1 User Agent 是Google的Bot / Crawler 这不是真的。这可能是指Go库&#xff08;根据您提到的来源&#xff0c;由Google开发&#xff0c;但是我找不到可靠的信息&#xff09;。 之前写过“G…...

yolov8 区域声光报警+计数

yolov8 区域报警计数 1. 基础2. 报警功能2. 1声音报警代码2. 2画面显示报警代码 3. 完整代码4. 源码 1. 基础 本项目是在 yolov8 区域多类别计数 的基础上实现的&#xff0c;具体区域计数原理可见上边文章 2. 报警功能 设置一个区域region_points&#xff0c;当行人这一类别…...

《QT实用小工具·五十五》带有标签、下划线的Material Design风格输入框

1、概述 源码放在文章末尾 该项目实现了一个带有标签动画、焦点动画、正确提示、错误警告的单行输入框控件。下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LABELEDEDIT_H #define LABELEDEDIT_H#include <QObject> #include <QWidget>…...

用Go实现一个无界资源池

写在文章开头 我们希望通过go语言实现一个简单的资源池&#xff0c;而这个资源池的资源包括但不限于: 数据库连接池线程池协程池网络连接池 只要这些资源实现我们指定的关闭方法&#xff0c;则都可以通过我们封装的资源池进行统一管理&#xff0c;需要简单说明一下这个资源池…...

Apache Seata基于改良版雪花算法的分布式UUID生成器分析2

title: 关于新版雪花算法的答疑 author: selfishlover keywords: [Seata, snowflake, UUID, page split] date: 2021/06/21 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 关于新版雪花算法的答疑 在上一篇关于新版雪花算法的解析中…...

13、揭秘JVM垃圾回收器:面试必备知识,你掌握了吗?

13.1、前文回顾 在上一篇文章中,我们详细分析了触发Minor GC的时机,以及对象何时会从新生代迁移到老年代。我们还讨论了为了确保新生代向老年代的内存迁移安全,需要在Minor GC之前如何检查老年代的内存空间,以及在什么情况下会触发老年代的Full GC,以及老年代的垃圾回收算…...

治疗耳鸣患者案例分享第二期

“患者耳鸣20年了&#xff0c;目前耳朵没有堵或者胀的感觉&#xff0c;但是偶尔有点痒&#xff0c;平时会有头晕头胀这种情况&#xff0c;然后头晕是稍微晕炫一下。然后头疼是经常有的&#xff0c;头胀不经常。” 患者耳鸣持续20年&#xff0c;虽然耳朵没有堵或胀的感觉&#x…...

数据加密的方法

这些方法可以单独或结合使用&#xff0c;以提高数据的安全性和保护隐私。 对称加密&#xff1a;使用相同的密钥对数据进行加密和解密。常见的对称加密算法包括DES、AES和RC4。 非对称加密&#xff1a;使用一对密钥&#xff08;公钥和私钥&#xff09;对数据进行加密和解密。发…...

Android BINDER是干嘛的?

1.系统架构 2.binder 源码位置&#xff1a; 与LINUX传统IPC对比...

运维各种中间件的手动安装(非常详细)

压缩文件夹 tar -zcvf newFolder.tar.gz oldFolder 把oldFolder文件夹压缩成newFolder.tar.gz解压文件夹 tar -zxvf 压缩文件名.tar.gzlinux安装jdk &#xff08;参考 https://blog.csdn.net/qq_42269466/article/details/124079963 &#xff09; 1、创建目录存放jdk包 mkd…...

【Android】Android应用性能优化总结

AndroidApp应用性能优化总结 最近大半年的时间里&#xff0c;大部分投在了某国内新能源汽车的某款AndroidApp开发上。 由于该App是该款车上&#xff0c;常用重点应用。所以车厂对应用性能的要求比较高。 主要包括&#xff1a; 应用冷启动达到***ms。应用热(温)启动达到***ms应…...

FBA头程海运发货流程是怎样的?

FBA头程发货作为整个FBA流程的关键一环&#xff0c;更是直接影响到商品从起点到终点的流通效率和成本。其中&#xff0c;海运作为一种经济、稳定的运输方式&#xff0c;在FBA头程发货中扮演着举足轻重的角色。那么&#xff0c;FBA头程海运发货流程究竟是怎样的呢? 1、装箱与发…...

二、VLAN原理和配置

vlan不是协议&#xff0c;是一个技术&#xff0c;虚拟局域网技术&#xff0c;基于802.1q协议。 vlan&#xff08;虚拟局域网&#xff09;&#xff0c;将一个物理的局域网在逻辑上划分成多个广播域的技术。 目录 1.冲突域和广播域 概念 范围 2.以太网帧格式 3.以太网帧封装…...

stackqueue类——适配器模式 双端队列deque(C++)

接下来我们将实现 stack、queue 类的常用函数&#xff0c;其实对于 stack 和 queue 的常用函数实现可以说得上是非常简单&#xff0c;若想详细了解可以看这篇&#xff1a;栈和队列&循环队列&#xff08;C/C&#xff09;_栈和循环队列-CSDN博客&#xff1b;在本篇中我们将使…...

SpringCloud知识点梳理

1. Spring Cloud 综述 1.1 Spring Cloud 是什么 [百度百科]Spring Cloud是⼀系列框架的有序集合。它利⽤Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中⼼、消息总线、负载均衡、断路器、数据监控等,都可以⽤ Spring Boot的开发⻛格…...

【NOI】C++程序结构入门之分支结构二

文章目录 前言一、逻辑运算符1.导入2.逻辑与&#xff08;&&&#xff09;3.逻辑或&#xff08;||&#xff09;4.逻辑非&#xff08;!&#xff09; 二、例题讲解问题&#xff1a;1656. 是两位的偶数吗问题&#xff1a;1658. 游乐设施问题&#xff1a;1659. 是否含有数字5…...

web自动化系列-使用普通模式编写测试用例以及存在问题(十六)

前面已经把selenium的主要操作介绍完毕 &#xff0c;接下来我们通过编写几条测试用例感受下selenium的用法 。 1.用例需求 还是以登录为例 &#xff0c;需要实现的测试用例为 &#xff1a; case1&#xff1a;输入正确的用户名和密码进行登录case2 : 输入正确的用户名和错误的…...

VSCode 配置 Qt 开发环境

文章目录 1. 环境说明2. 配置系统环境变量 1. 环境说明 操作系统&#xff1a;Windows 11VSCode版本&#xff1a;1.88.1CMake版本&#xff1a;3.27.7Qt6版本&#xff1a;6.7.0(MinGW 11.2.0 64-bit) 2. 配置系统环境变量 自行根据自己的Qt安装路径配置 配置 MinGW 和 CMake C…...

【Jenkins】持续集成与交付 (七):Gitlab添加组、创建用户、创建项目和源码上传到Gitlab仓库

🟣【Jenkins】持续集成与交付 (七):Gitlab添加组、创建用户、创建项目和源码上传到Gitlab仓库 1、创建组2、创建用户3、将用户添加到组中4、在用户组中创建项目5、源码上传到Gitlab仓库5.1 初始化版本控制5.2 将文件添加到暂存区5.3 提交代码到本地仓库5.4 推送代码到 Git…...

L1-017 到底有多二

一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数&#xff0c;则程度增加0.5倍&#xff1b;如果还是个偶数&#xff0c;则再增加1倍。例如数字-13142223336是个11位数&#xff0c;其中有3个2&#xff0c;并且是负数&#xff0c;也是偶数&…...

常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet

无论是基于成本效益还是社区支持&#xff0c;我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具&#xff1a;Kaldi&#xff0c;Paddle&#xff0c;WeNet&#xff0c;EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具&#xff0c;由Daniel Pove…...

python笔记 | 哥德巴赫猜想

哥德巴赫猜想&#xff1a;每个不小于6的偶数都可以表示成两个素数之和。 素数&#xff1a;只能被1和自身整除的正整数。就是大于1且除了1和它本身之外没有其他因数的数。例如&#xff0c;2、3、5、7、11等都是素数&#xff0c;而4、6、8、9等则不是素数。 下面这段Python代码…...

IO基础-IO多路复用基础

Java的Selector封装了底层epoll和poll的API&#xff0c;可以通过指定如下参数来调用执行的内核调用, 在Linux平台&#xff0c;如果指定 -Djava.nio.channels.spi.SelectorProvidersun.nio.ch.PollSelectorProvider 则底层调用poll&#xff0c; -Djava.nio.channels.spi.Selec…...

wordpress同步微博插件/推广赚佣金的平台

中科院计算所团队“完全自主设计、开发和实现”的“木兰”编程语言是Python语言的套壳产品&#xff1f;针对近日这一网络质疑&#xff0c;1月17日&#xff0c;项目负责人、中科院计算所编译实验室员工刘雷在科学网上发表回应称&#xff0c;木兰语言在8位单片机上的编译器是本团…...

国产安卓开发工具/昆明排名优化

jQuery EasyUI 组合框(ComboBox)可以把一些HTML控件组合成一个控件&#xff0c;从而达到我们所期望的效果&#xff0c;下面介绍一下组合框详细用法&#xff1a;&#xff08;查看演示&#xff09;HTML代码&#xff1a;首先要定义个select <select id"cc" name"…...

科技馆网站建设方案/拼多多seo怎么优化

2019独角兽企业重金招聘Python工程师标准>>> Android系统中自带的图标&一些预定义样式&Android 系统颜色值 Android系统中自带了很多图标&#xff0c;我们的程序可以方便使用。 Android™ 1.5 android.R.drawable Icon Resources http://since2006.com/andr…...

更新服务 wordpress/模板网站建站哪家好

一.Base镜像&#xff08;scratch&#xff09; docker hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的 二.自定义镜像mycentoses 1.编写&#xff1a; 1&#xff09;Hub默认centos镜像什么情况&#xff0c; 如下&#xff1a; 现在要实现这3点 2&#xff0…...

武汉网站排名系统/小蝌蚪幸福宝入口导航

1.Counter Counter是对字典类型的补充&#xff0c;用于追踪值的出现次数。它具备字典的所有功能。在python的内部实现中&#xff0c;Counter类继承了dict类。 1.1 基本用法 >>> import collections >>> obj collections.Counter(I Dreamed A Dream) &g…...

wordpress windows下载/百度推广搜索排名

问题 如果是分批买入&#xff0c;分批卖出&#xff0c;最后的总收益的年化收益率如何计算&#xff1f; ** 示例&#xff1a;** DAY1&#xff1a;5.0买入100份 出500.0 DAY2&#xff1a;6.0买入200份 出1200.0 DAY3&#xff1a;7.0卖出300份 入2100.0 年化收益率怎么计算&…...