目录

1、需求描述

2、选择URI Scheme实现

3、何为URI Scheme?

4、将自定义的URL Scheme信息写入注册表的C++源码实现

5、如何实现最开始的3种需求

6、后续需要考虑的细节问题


       之前陆续收到一些从Web页面上启动我们C++客户端软件的需求,希望我们能提供一些技术上的支持与协助,支持从Web网页上将我们的C++客户端软件启动起来。于是我大概地研究了相关的实现方法,下面把研究的过程与结果在此做一个分享,希望能给大家提供一个借鉴或参考。

C++软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达10000多个,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C/C++实战专栏(重点专栏,专栏文章已更新500多篇,订阅量已达8000多个,欢迎订阅,持续更新中...)https://blog.csdn.net/chenlycly/article/details/140824370C++ 软件开发从入门到实战(重点专栏,专栏文章已更新300多篇,欢迎订阅,持续更新中...)https://blog.csdn.net/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_2276111.html

1、需求描述

       最近多个第三方开发厂商为了快速集成我们的软件及系统(把我们的软件系统作为子系统,融入到他们的大型业务系统中),不想基于我们软件SDK做费时费力的二次开发,而是直接从Web网页上启动我们客户端软件。简单地归纳了一下,类似的需求可以分以下几类:

1)仅仅是从Web网页上将C++客户端软件启动起来,即将软件调起来就行了,没有后续自动操作。用户根据自己的需要,手动操作我们的软件。

2)从Web网页上将C++客户端软件启动起来,并给软件传递服务器地址、用户名和密码,让软件自动发起登陆,登录成功后显示登录后的界面。

3)从Web网页上将C++客户端软件启动起来,并且启动时传递一些信息,让软件执行指定的一些操作。比如给软件传递服务器地址、用户名和密码等信息,让软件自动发起登录,并加入到指定的会议中。

       其实上述需求可以简单的归结为,将C++客户端软件启动起来,并给C++客户端软件传递一些命令行参数,C++客户端软件解析出参数,执行指定的操作。

      以浏览器打开腾讯会议的会议链接为例,比如在IM软件中分享的腾讯会议的会议链接如下所示:

点击上面的会议链接,系统用系统中安装的浏览器打开链接(或者手动将上述会议链接拷贝到浏览器中打开),如下所示:

点击加入会议按钮,会弹出是否要打开本地安装的腾讯会议程序的提示框:

 点击打开腾讯会议,将本地安装的腾讯会议启动起来,并自动加入到指定的会议中:

2、选择URI Scheme实现

       如果是在C++程序中启动一个C++软件,会比较简单,只要获取一下目标软件的安装路径(可以从注册表中读取,安装程序时会将软件的安装路径写到注册表中),就能直接通过软件的全路径,直接将软件启动起来了。

       现在越来越多的系统都转向B/S架构,用户可以随处随地访问到系统中去,只要有网络有电脑就行了,不用再安装各种客户端软件了。就像我们上面提到的一些客户一样,因为某些业务场景的需要,可能需要从Web网页上启动系统中安装的基于C/S架构的客户端软件。

       Web网页一般都是在浏览器中打开的,出于安全的原因,Web浏览器既不能直接读写注册表,即无法通过访问注册表获取要启动软件的安装路径,所以无法像C++程序那样直接启动二进制文件,所以在Web网页中想启动本地的应用程序似乎遇到了问题。其实这并不是问题,我们使用URI Scheme技术与规范就能实现这样的需求

3、何为URI Scheme?

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbGluay3liJ3miaw=,size_13,color_FFFFFF,t_70,g_se,x_16

       URI,全称是Uniform Resource Identifier,统一资源标志符。在Web开发领域,其表示的是Web上每一种可用的资源,如HTML文档、图片、视频等。URI Scheme,我们称之为URI方案,是一种技术规范,其中的URI是个更宽泛的概念,它可以是一个本地的文件,也可以是一个网络上的视频。

       从Web网页中启动本地应用程序的URI Scheme规范中,需要将本地应用程序的信息通过写注册表的方式注册到系统中,然后在网页中使用“SchemeName://”就可以只在启动本地程序了。具体的做法是,在注册表的HKEY_CLASSES_ROOT下创建一个自定义的SchemeName注册表节点,然后再在该节点下创建多个节点,并在给相关节点设置注册表键值。

       以QQ内嵌的QQGame为例,添加注册表信息的步骤如下:

1)在HKEY_CLASSES_ROOT下创建QQGameProtocol节点

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbGluay3liJ3miaw=,size_17,color_FFFFFF,t_70,g_se,x_16

      QQGameProtocol就是对应的Scheme方案名称,也是Web页面上启动对应程序的URL的前缀名称,即QQGameProtocol://。然后给该节点添加一个URL Protocol名称的键值,将其Value设置为本地应用程序的完整路径。对于当前的QQGameProtocol,就是C:\Users\Public\Documents\Tencent\QQGameMicro\QQGwp.exe,如上图所示。

2)在QQGameProtocol根节点下创建DefaultIcon节点

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbGluay3liJ3miaw=,size_17,color_FFFFFF,t_70,g_se,x_16

       给DefaultIcon节点设置默认的字符串键值(REG_SZ类型),其Value的格式为“应用程
序全路径,图标索引”的形式,该键值是用来指定该URI方案使用的图标。本例中的Value
为:C:\Users\Public\Documents\Tencent\QQGameMicro\QQGwp.exe,1,如上图所示。

3)在QQGameProtocol下创建shell节点

watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAbGluay3liJ3miaw=,size_17,color_FFFFFF,t_70,g_se,x_16

       先在QQGameProtocol下创建shell节点,然后在shell节点下创建open节点,然后在open节点创建command节点。shell节点和open节点不需要设置键值,command节点需要设置键值,其键值用来指定启动目标应用程序时是否给目标程序传递命令行参数。

       一般只需要设置传递一个参数即可,比如当前Scheme下的"C:\Users\Public\Documents\Tencent\QQGameMicro\QQGwp.exe" "%1"。如果要传递多个参数,可以自定义一个组合格式,命令行只用一个参数即可。比如我们要给目标程序传递服务器地址、用户名和密码,可以采用这样的组合格式:

#serveraddr=192.168.72.135#username=admin1#password=123456

即将要传递的多个参数按指定的格式组合起来生成一个命令行字符串参数即可。

       当在Web页面上点击“SchemeName://”链接时,就会到系统注册表的HKEY_CLASSES_ROOT节点下查找SchemeName节点项,找到后取出目标应用程序的全路径,并查找传递的命令行参数个数,这样就能把本地的目标应用程序启动起来了。

       如果要给目标程序传递参数,则使用“SchemeName://参数”的形式。经测试发现,如果在command节点中设置了%1传递参数的标识,则Web网页中设置的URL必须要带参数,即“SchemeName://参数”。如果使用不带参数的URL:“SchemeName://”,则无法启动目标程序。

       那如何既要支持不传参数启动,也要支持传参数启动呢?难道要在注册表中创建两个不同的SchemeName节点?其实不用这么麻烦,使用一个带参数的SchemeName节点就够了,对于直接启动目标程序不带启动参数的,也可以携带一个标识参数,在程序中约定不传参数的标识符,比如noparam,当程序中解析出noparam,则表示是不带参数启动的,直接启动程序即可,不用做后续的操作。


        在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:【C++软件异常与异常排查从入门到精通系列教程】该精品技术专栏的订阅量已达到10000多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,已经更新到200篇以上!欢迎订阅!)

C++软件调试与异常排查从入门到精通系列文章汇总https://blog.csdn.net/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法详细讲述了C++软件的调试方法与手段详细介绍分析C++软件问题的常用分析工具,以图文并茂的方式给出具体的项目问题实战分析实例(详细讲述分析排查过程,很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:【C/C++实战进阶】(该专栏涵盖了C++多方面的内容,是当前重点打造的专栏,订阅量已达8000多个,专栏文章已经更新到500多篇,持续更新中...)

C/C++实战进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、数据结构与算法C++11及以上新特性(开源代码中可能会用到很多新特性(比如WebRTC开源库),日常编码中也会用到部分新特性,面试时也会频繁地涉及到,学习新特性很有必要)、常用C++开源库的介绍与使用(比如SQLite、libcurl、libwebsockets、libevent、jsoncpp/RapidJson、Redis、RabbitMQ、MongoDB、MQTT、ZooKeeper、OpenCV、FFmpeg、SDL、GStreamer、Live555、ReactOS等)、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(引发C++软件异常的常见原因分析与总结、排查C++软件异常的手段与方法、分析C++软件异常的基础知识、使用常用软件分析工具分析C++软件问题、多个项目实战问题分析案例分享等)、设计模式(单例模式、工厂模式、观察者模式、状态模式等)、网络基础知识与网络问题分析进阶内容(实战问题分析实例分享)等。本专栏的内容都是建立在项目实践的基础上,来源于项目实战,服务于项目实战,很有实战参考价值!

专栏3:【分析C++软件问题的实用软件与高效工具实战案例集锦】

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/131405795

常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro以及内存泄漏检测工具等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏4:【VC++常用功能代码封装】

VC++常用功能开发汇总(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5:【C/C++软件开发从入门到实战】(本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,专栏文章已经更新到300多篇,持续更新中!欢迎订阅!) 

C++ 软件开发从入门到精通(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了C/C++软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


4、将自定义的URL Scheme信息写入注册表的C++源码实现

       下面给出将自定义的URL Scheme信息写入注册表的C++源码实现:

BOOL WriteURISchemaReg()
{// exe程序的完整路径CString strExePath = m_strInstallPath + _T("xyzlink.exe");// URI Scheme名称CString strProtocolName = _T("XyzlinkProtocol");HKEY hRootKey = NULL;DWORD dwKeyValue = 0;DWORD dwDisposition = 0;UCHAR szBuf[MAX_PATH] = { 0 };// 1、在HKEY_CLASSES_ROOT下创建URI Schema相关注册表的根节点RootNodelong lRet = ::RegCreateKeyEx(HKEY_CLASSES_ROOT, ProtocalNodeName, 0, NULL, 0,KEY_ALL_ACCESS, NULL, &hRootKey, &dwDisposition);if (lRet != ERROR_SUCCESS){return FALSE;}// 给根节点RootNode设置值1lRet = ::RegSetValueEx(hRootKey, NULL, 0, REG_SZ, (LPBYTE)(LPCTSTR)strProtocolName,strProtocolName.GetLength() * sizeof(TCHAR));if (lRet != ERROR_SUCCESS){RegCloseKey(hRootKey);return FALSE;}// 给根节点RootNode设置值2CString strKey = _T("URL Protocol");lRet = RegSetValueEx(hRootKey, strKey.GetBuffer(0), 0, REG_SZ, (LPBYTE)(LPCTSTR)strExePath,strExePath.GetLength() * sizeof(TCHAR));if (lRet != ERROR_SUCCESS){RegCloseKey(hRootKey);return FALSE;}// 2、在根节点RootNode下创建DefaultIcon节点strKey = _T("DefaultIcon");HKEY hDefaultIconKey = NULL;lRet = RegCreateKeyEx(hRootKey, strKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hDefaultIconKey, &dwDisposition);if (lRet != ERROR_SUCCESS){RegCloseKey(hRootKey);return FALSE;}// 给RootNode\DefaultIcon节点设置值CString strExePathPlus = strExePath + _T(",1");lRet = RegSetValueEx(hDefaultIconKey, NULL, 0, REG_SZ, (LPBYTE)(LPCTSTR)strExePathPlus,strExePathPlus.GetLength() * sizeof(TCHAR));if (lRet != ERROR_SUCCESS){RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return FALSE;}// 3、在RootNode\DefaultIcon节点下创建子节点shellstrKey = _T("shell");HKEY hShellKey = NULL;lRet = RegCreateKeyEx(hDefaultIconKey, strKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hShellKey, &dwDisposition);if (lRet != ERROR_SUCCESS){RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return FALSE;}// 4、在RootNode\DefaultIcon\shell节点下创建子节点openstrKey = _T("open");HKEY hOpenKey = NULL;lRet = RegCreateKeyEx(hShellKey, strKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hOpenKey, &dwDisposition);if (lRet != ERROR_SUCCESS){RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return FALSE;}// 5、在RootNode\DefaultIcon\shell\open节点下创建子节点commandstrKey = _T("command");HKEY hCommandKey = NULL;lRet = RegCreateKeyEx(hOpenKey, strKey, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hCommandKey, &dwDisposition);if (lRet != ERROR_SUCCESS){RegCloseKey(hOpenKey);RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return FALSE;}// 给command节点设置值(命令行参数)CString strCmdParam;strCmdParam.Format(_T("\"%s\" \"%%1\""), strExePath);lRet = RegSetValueEx(hCommandKey, NULL, 0, REG_SZ, (LPBYTE)(LPCTSTR)strCmdParam,strCmdParam.GetLength() * sizeof(TCHAR));if (lRet != ERROR_SUCCESS){RegCloseKey(hCommandKey);RegCloseKey(hOpenKey);RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return FALSE;}RegCloseKey(hCommandKey);RegCloseKey(hOpenKey);RegCloseKey(hDefaultIconKey);RegCloseKey(hRootKey);return TRUE;
}

5、如何实现最开始的3种需求

       搞清楚了使用URI Scheme规范实现从Web页面中启动本地应用程序的方法,下面我们再回到最开始提出的3个需求,看看如何去实现。

       第一种需求不需要传递参数,后面两种需求则需要传递参数,我们使用一个带参数传递的Scheme节点即可。我们可以定义一个启动type类型标识launchtype,对于直接启动的,type为noparam。对于启动后发起自动登录的,type为autologin;对于启动后需要执行具体操作的,可以根据具体的业务,定义具体的type类型,这样更灵活。

       对于目标应用程序,则可以根据不同的type类型,解析对应的参数数据,并对参数的合法性进行校验。

       下面把Web网页的测试代码给出来,保存成.html文件,用浏览器打开即可:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Start exe demo</title>
</head>
<body>
<a href="SchemeName://">打开目标程序</a> 
</body >
</html >

6、后续需要考虑的细节问题

       上面大概说了一下问题的解决办法和思路,其实还有很多细节需要去考虑。比如下面的几种场景:

1)程序可能没有安装

       如果目标应用程序没有安装,肯定是启动不起来的,是不是要检测启动失败的原因,然后自动跳转到安装程序的下载页面。

2)仅将目标程序启动起来,但目标程序已经运行

       一般情况下,很多程序都是单实例运行的,即只允许运行一个实例。假定目标程序是单实例运行的,点击Web页面中的启动程序的链接时,已经有个进程在运行了,目标程序中要弹出程序已经运行的提示,并将已经启动的程序拉到前端显示。

3)启动程序后需要有后续操作,但目标程序已经运行

       启动程序后需要有后续操作,比如自动发起登录,但此时目标应用程序已经运行。如果已启动的进程还没登录,是要自动发起登录?还是搁置不管?如果已启动的进程已经登录,则提示已经启动,并将已启动的主窗口拉到最前显示。如果目标程序已经启动且已经登录成功,则需要将命令行参数发给已启动的进程,让该进程执行要执行的操作,比如加入会议。

PS. 微软官方说明连接:

Registering an Application to a URI Scheme

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

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

相关文章

机器学习02——模型评估与选择(过拟合与欠拟合、K折交叉验证、均方误差、混淆矩阵)

上一章&#xff1a;机器学习01——机器学习概述 下一章&#xff1a;机器学习03——线性模型 机器学习实战项目&#xff1a;【从 0 到 1 落地】机器学习实操项目目录&#xff1a;覆盖入门到进阶&#xff0c;大学生就业 / 竞赛必备 文章目录一、经验误差与过拟合&#xff08;一&a…

基于 Django 与 Bootstrap 构建的现代化设备管理平台

整体步骤概览 创建项目和应用设计模型&#xff08;Model&#xff09; - 定义设备的数据结构配置用户认证&#xff08;Auth&#xff09; - 使用 Django 自带的强大用户系统创建视图&#xff08;View&#xff09; - 处理业务逻辑&#xff1a;登录、列表、增删改查编写模板&#x…

微软依旧稳定发挥,Windows 最新更新性能「开倒车」

微软在前不久为Release Preview测试用户推送了最新Windows11 25H2版本。按照惯例&#xff0c;正式版将于9月或者10月与咱们见面。虽然看起来是个跨版本的大更新&#xff0c;但是更新方式将服务堆栈更新&#xff08;SSU&#xff09;与最新累积更新&#xff08;LCU&#xff09;。…

一手实测,文心x1.1的升级很惊喜啊

一手实测&#xff0c;文心x1.1的升级很惊喜啊 前言 月9日&#xff0c;在 WAVE SUMMIT深度学习开发者大会上 百度发布了一个新的思考模型文心x1.1&#xff1a; X1 Turbo 升级为 X1.1 了。 文心4.5 Turbo 和 X1 Turbo 是2025年4月25日发布的&#xff0c;距今已经半年过去了&…

Flask 核心基础:从 路由装饰器 到 __name__ 变量 的底层逻辑解析

Flask 核心基础&#xff1a;从路由装饰器到 name 变量的底层逻辑解析 在使用 Flask 开发 Web 应用时&#xff0c;我们总会从 app Flask(__name__) 和 app.route("/") 这两行代码开始。看似简单的语法背后&#xff0c;藏着 Python 装饰器机制与 Flask 框架设计的核心…

中国AI云市场报告:阿里云份额达35.8%,高于2至4名总和

9月9日&#xff0c;国际权威市场调研机构英富曼&#xff08;Omdia&#xff09;发布《中国AI云市场&#xff0c;1H25》报告&#xff0c;报告显示&#xff0c;2025年上半年&#xff0c;中国AI云市场规模达223亿元&#xff0c;阿里云占比35.8%位列第一&#xff0c;市场份额高于2到…

鸿蒙Next开发指南:UIContext接口解析与全屏拉起元服务实战

前言在鸿蒙应用开发过程中&#xff0c;我们经常会遇到需要获取UI上下文实例或者在非UI上下文中调用UI相关方法的场景。随着HarmonyOS NEXT的不断发展&#xff0c;UIContext API为我们提供了更加优雅的解决方案。本文将详细介绍如何使用UIContext中对应的接口获取与实例绑定的对…

leaflet读取mvt格式

如图所示&#xff0c;是全国的数据&#xff0c;截图是部分数据先安装&#xff1a;npm install leaflet npm install leaflet.vectorgrid如果是其余的框架直接用就行&#xff1a;import * as L from leaflet; import leaflet.vectorgrid;我用的是angular,所以是ts中声明&#xf…

OSG中交互(鼠标、键盘)处理

OpenSceneGraph (OSG) 中的交互处理,包括鼠标和键盘事件。 一、OSG 事件处理体系 OSG 使用一个基于访问者模式的事件处理体系,核心类包括: osgGA::GUIEventHandler: 所有事件处理器的基类 osgViewer::Viewer: 查看器,管理事件队列和分发 osgGA::EventQueue: 事件队列…

微硕双N-MOS管WST3392在汽车智能氛围灯系统中的应用

汽车智能氛围灯系统是现代车辆提升驾乘体验的重要配置&#xff0c;其多通道LED的精密调光与控制需选用高性能、小体积的功率开关器件。微硕WINSOK的WST3392是一款双N沟道MOS管&#xff0c;具有30V耐压、3.7A连续电流和46mΩ的低导通电阻&#xff0c;特别适用于氛围灯系统中的多…

深入 Kubernetes:从零到生产的工程实践与原理洞察

&#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1f680; 每一个算法都是我点燃的推进器&#xff0c;每一行代码都是我航行的星图。 &#x…

为何三折叠手机只有华为可以?看华为Mate XTs非凡大师就知道

9月4日&#xff0c;华为在深圳举行华为Mate XTs非凡大师及全场景新品发布会&#xff0c;不同于过往手机发布会对芯片配置只字不提&#xff0c;此次发布会公开展示了华为Mate XTs非凡大师内部芯片配置——麒麟9020芯片&#xff0c;时隔四年&#xff0c;终于在发布会上看到芯片公…

TensorFlow 2.x 核心 API 与模型构建

TensorFlow 2.x 核心 API 与模型构建TensorFlow 是一个强大的开源机器学习库&#xff0c;尤其在深度学习领域应用广泛。TensorFlow 2.x 在易用性和效率方面做了大量改进&#xff0c;引入了Keras作为其高级API&#xff0c;使得模型构建和训练更加直观和便捷。本文将介绍 TensorF…

TENGJUN防水TYPE-C连接器:工业级防护,认证级可靠,赋能严苛场景连接

在工业控制、户外电子、水下设备等对连接稳定性与防护性要求极致的场景中&#xff0c;TENGJUN防水TYPE-C连接器以“硬核性能全面认证”的双重优势&#xff0c;成为关键连接环节的信赖之选。从结构设计到认证标准&#xff0c;每一处细节都为应对复杂环境而生&#xff0c;重新定义…

【小呆的随机振动力学笔记】概率论基础

文章目录0. 概率论基础0.1 概率的初步认知0.2 随机变量的分布0.3 随机变量的数字特征0.3.1 随机变量的期望算子0.3.2 随机变量的矩0.4 随机变量的特征函数0.5 高数基础附录A 典型分布0. 概率论基础 \quad\quad在生活中或自然中&#xff0c;处处都存在随机现象&#xff0c;比如每…

使用海康机器人相机SDK实现基本参数配置(C语言示例)

在机器视觉项目开发中&#xff0c;相机的初始化、参数读取与设置是最基础也是最关键的环节。本文基于海康机器人&#xff08;Hikrobot&#xff09;提供的MVS SDK&#xff0c;使用C语言实现了一个简洁的控制程序&#xff0c;完成设备枚举、连接以及常用参数的获取与设置。 &…

【IoTDB】时序数据库选型指南:为何IoTDB成为工业大数据场景的首选?

【作者主页】Francek Chen 【专栏介绍】⌈⌈⌈大数据与数据库应用⌋⌋⌋ 大数据是规模庞大、类型多样且增长迅速的数据集合&#xff0c;需特殊技术处理分析以挖掘价值。数据库作为数据管理的关键工具&#xff0c;具备高效存储、精准查询与安全维护能力。二者紧密结合&#xff0…

用计算思维“破解”复杂Excel考勤表的自动化之旅

在我们日常工作中&#xff0c;经常会遇到一些看似简单却极其繁琐的任务。手动处理一份结构复杂的Excel考勤表&#xff0c;就是典型的例子。它充满了合并单元格、不规则的布局和隐藏的格式陷阱。面对这样的挑战&#xff0c;我们是选择“卷起袖子&#xff0c;日复一日地手动复制粘…

PAT 1006 Sign In and Sign Out

1006 Sign In and Sign Out分数 25作者 CHEN, Yue单位 浙江大学At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing ins and outs, yo…

【git】首次clone的使用采用-b指定了分支,还使用了--depth=1 后续在这个基础上拉取所有的分支代码方法

要解决当前问题&#xff08;从浅克隆转换为完整克隆并获取所有分支&#xff09;&#xff0c;请按照以下步骤操作&#xff1a; 步骤 1&#xff1a;检查当前远程地址 首先确认远程仓库地址是否正确&#xff1a; git remote -v步骤 2&#xff1a;修改远程配置以获取所有分支 默认浅…