Qt/C++ 调用迅雷开放下载引擎(ThunderOpenSDK)下载数据资源
目录导读
- 前言
- ThunderOpenSDK 简介
- 参考 xiaomi_Thunder_Cloud 示例
- ThunderOpenSDK 下载问题
前言
在对以前老版本的exe执行程序进行研究学习的时候,发现以前的软件是使用的ThunderOpenSDK这个迅雷开放下载引擎进行的项目数据下载,于是在网上搜索一番找到了相关内容,但是不知道为什么了相关资料相当少,不过用是真的好用,于是仔细的研究了一下。
ThunderOpenSDK 简介
ThunderOpenSDK 是一个迅雷开放下载引擎的 SDK,允许开发者在自己的应用程序中集成迅雷的下载功能。该 SDK 提供了丰富的接口,支持多种下载任务的管理,包括任务的创建、启动、停止、删除等操作。此外,SDK 还支持设置下载速度限制、代理、用户代理等功能,以满足不同应用场景的需求。
出自:ThunderOpenSDK 使用教程
相关内容参考:
迅雷开放下载引擎(ThunderOpenSDK)使用指南
ThunderOpenSDK 使用教程
配置云平台ip和端口 云平台接口
GitHub: ThunderOpenSDK
ThunderOpenSDK 不需要再进行编译,直接附加到项目中就能直接使用,甚至示例程序都写好了,只管调用。
GitHub示例中有0.CurUseCommonLib,360Jisu_Thunder_Cloud,liebao_Thunder_Cloud,xiaomi_Thunder_Cloud,XunleiDownload_Old 5个版本的示例,
可以根据需求任选一个
通过查看xldl.dll文件的属性信息和Github上的声明,
我都毫不怀疑这些库文件是不是是从某个软件上扒下来的。
参考 xiaomi_Thunder_Cloud 示例
以xiaomi_Thunder_Cloud 迅雷云加速开发平台版本示例;
打开xldl.h文件可以发现xldl.dll的接口和数据结构都已经声明好还有注释,只管调用:
- xldl.h:
#pragma once// 所有结构体定义按1字节对齐
#pragma pack(push, 1)
struct DownTaskParam
{DownTaskParam(){memset(this, 0, sizeof(DownTaskParam));nReserved1 = 5;bReserved = FALSE;DisableAutoRename = FALSE;IsOnlyOriginal = FALSE;IsResume = TRUE;}int nReserved;wchar_t szTaskUrl[2084]; // 任务URLwchar_t szRefUrl[2084]; // 引用页wchar_t szCookies[4096]; // 浏览器cookiewchar_t szFilename[MAX_PATH]; // 下载保存文件名.wchar_t szReserved0[MAX_PATH];wchar_t szSavePath[MAX_PATH]; // 文件保存目录HWND hReserved;BOOL bReserved; wchar_t szReserved1[64];wchar_t szReserved2[64];BOOL IsOnlyOriginal; // 是否只从原始地址下载UINT nReserved1;BOOL DisableAutoRename; // 禁止智能命名BOOL IsResume; // 是否用续传DWORD reserved[2048];
};
enum DOWN_TASK_STATUS
{NOITEM = 0,TSC_ERROR,TSC_PAUSE,TSC_DOWNLOAD,TSC_COMPLETE,TSC_STARTPENDING,TSC_STOPPENDING
};
enum TASK_ERROR_TYPE
{TASK_ERROR_UNKNOWN = 0x00, // 未知错误TASK_ERROR_DISK_CREATE = 0x01, // 创建文件失败TASK_ERROR_DISK_WRITE = 0x02, // 写文件失败TASK_ERROR_DISK_READ = 0x03, // 读文件失败TASK_ERROR_DISK_RENAME = 0x04, // 重命名失败TASK_ERROR_DISK_PIECEHASH = 0x05, // 文件片校验失败TASK_ERROR_DISK_FILEHASH = 0x06, // 文件全文校验失败TASK_ERROR_DISK_DELETE = 0x07, // 删除文件失败失败TASK_ERROR_DOWN_INVALID = 0x10, // 无效的DOWN地址TASK_ERROR_PROXY_AUTH_TYPE_UNKOWN = 0x20, // 代理类型未知TASK_ERROR_PROXY_AUTH_TYPE_FAILED = 0x21, // 代理认证失败TASK_ERROR_HTTPMGR_NOT_IP = 0x30, // http下载中无ip可用TASK_ERROR_TIMEOUT = 0x40, // 任务超时TASK_ERROR_CANCEL = 0x41, // 任务取消TASK_ERROR_TP_CRASHED= 0x42, // MINITP崩溃TASK_ERROR_ID_INVALID = 0x43, // TaskId 非法
};
struct DownTaskInfo
{DownTaskInfo(){memset(this, 0, sizeof(DownTaskInfo));stat = TSC_PAUSE;fail_code = TASK_ERROR_UNKNOWN;fPercent = 0;bIsOriginUsable = false;fHashPercent = 0;}DOWN_TASK_STATUS stat;TASK_ERROR_TYPE fail_code;wchar_t szFilename[MAX_PATH];wchar_t szReserved0[MAX_PATH];__int64 nTotalSize; // 该任务总大小(字节)__int64 nTotalDownload; // 下载有效字节数(可能存在回退的情况)float fPercent; // 下载进度int nReserved0;int nSrcTotal; // 总资源数int nSrcUsing; // 可用资源数int nReserved1;int nReserved2;int nReserved3;int nReserved4;__int64 nReserved5;__int64 nDonationP2P; // p2p贡献字节数__int64 nReserved6;__int64 nDonationOrgin; // 原始资源共享字节数__int64 nDonationP2S; // 镜像资源共享字节数__int64 nReserved7;__int64 nReserved8;int nSpeed; // 即时速度(字节/秒)int nSpeedP2S; // 即时速度(字节/秒)int nSpeedP2P; // 即时速度(字节/秒)bool bIsOriginUsable; // 原始资源是否有效float fHashPercent; // 现不提供该值int IsCreatingFile; // 是否正在创建文件DWORD reserved[64];
};
enum DOWN_PROXY_TYPE
{PROXY_TYPE_IE = 0,PROXY_TYPE_HTTP = 1,PROXY_TYPE_SOCK4 = 2,PROXY_TYPE_SOCK5 = 3,PROXY_TYPE_FTP = 4,PROXY_TYPE_UNKOWN = 255,
};
enum DOWN_PROXY_AUTH_TYPE
{PROXY_AUTH_NONE =0,PROXY_AUTH_AUTO,PROXY_AUTH_BASE64,PROXY_AUTH_NTLM,PROXY_AUTH_DEGEST,PROXY_AUTH_UNKOWN,
};
struct DOWN_PROXY_INFO
{BOOL bIEProxy;BOOL bProxy;DOWN_PROXY_TYPE stPType;DOWN_PROXY_AUTH_TYPE stAType;wchar_t szHost[2048];INT32 nPort;wchar_t szUser[50];wchar_t szPwd[50];wchar_t szDomain[2048];
};
struct WSAPROTOCOL_INFOW;#pragma pack(pop)namespace DownEngine
{extern "C" __declspec(dllimport) BOOL XL_Init(void);extern "C" __declspec(dllimport) BOOL XL_UnInit(void);extern "C" __declspec(dllimport) HANDLE XL_CreateTask(DownTaskParam &stParam);extern "C" __declspec(dllimport) BOOL XL_DeleteTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL XL_StartTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL XL_StopTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL XL_ForceStopTask(HANDLE hTask);extern "C" __declspec(dllimport) BOOL XL_QueryTaskInfo(HANDLE hTask, DownTaskInfo & stTaskInfo); //旧版接口,使用Ex接口替换extern "C" __declspec(dllimport) BOOL XL_QueryTaskInfoEx(HANDLE hTask, DownTaskInfo & stTaskInfo);extern "C" __declspec(dllimport) BOOL XL_DelTempFile(DownTaskParam &stParam);extern "C" __declspec(dllimport) void XL_SetSpeedLimit(INT32 nKBps);extern "C" __declspec(dllimport) void XL_SetUploadSpeedLimit(INT32 nTcpKBps,INT32 nOtherKBps);extern "C" __declspec(dllimport) BOOL XL_SetProxy(DOWN_PROXY_INFO &stProxyInfo);extern "C" __declspec(dllimport) void XL_SetUserAgent(const wchar_t *pszUserAgent);extern "C" __declspec(dllimport) BOOL XL_ParseThunderPrivateUrl(const wchar_t *pszThunderUrl, wchar_t *normalUrlBuffer, INT32 bufferLen);extern "C" __declspec(dllimport) BOOL XL_GetFileSizeWithUrl(const wchar_t * lpURL, INT64& iFileSize);extern "C" __declspec(dllimport) BOOL XL_SetFileIdAndSize(HANDLE hTask, char szFileId[40], unsigned __int64 nFileSize);extern "C" __declspec(dllimport) BOOL XL_SetAdditionInfo( HANDLE task_id, WSAPROTOCOL_INFOW *sock_info, CHAR *http_resp_buf, LONG buf_len );extern "C" __declspec(dllimport) HANDLE XL_CreateTaskByURL(const wchar_t *url, const wchar_t *path, const wchar_t *fileName, BOOL IsResume);extern "C" __declspec(dllimport) LONG XL_CreateTaskByThunder(wchar_t *pszUrl, wchar_t *pszFileName, wchar_t *pszReferUrl, wchar_t *pszCharSet, wchar_t *pszCookie);extern "C" __declspec(dllimport) LONG XL_CreateBTTaskByThunder(const wchar_t *pszPath);
};
相关函数的具体说明,可以参考Github上的文档
这一版本没有调用的示例,但是没关系,liebao_Thunder_Cloud这一版本有调用示例;
参考thunderWrapper.h文件中的thunderWrapper类通过
LoadLibrary和GetProcAddress函数调用,使用MSCV2017编译器
并添加<Windows.h>
引用,建议添加:
#include <Windows.h>
#include <stdio.h>
#include <Shlwapi.h>
#pragma comment(lib,"Shlwapi")
- 初始化函数示例:
只需要简单修改init方法,修改xldl.dll的加载路径,其他基本不变;
bool init(PCWSTR pDllPath = L"xldl.dll")
{assert(!m_hModule);WCHAR szModulePath[MAX_PATH] = { 0 };GetModuleFileNameW(NULL, szModulePath, MAX_PATH);PathRemoveFileSpecW(szModulePath); // 拆分路径 新版使用PathCchRemoveFileSpecqDebug()<<"[szModulePath] "<<QString::fromWCharArray(szModulePath);WCHAR szDllpath[MAX_PATH] = { 0 };PathCombineW(szDllpath, szModulePath, L"xldl.dll"); // 连接路径, 新版建议使用 PathCchCombineqDebug()<<"[szDllpath] "<<QString::fromWCharArray(szDllpath);m_hModule = LoadLibraryW(szDllpath);assert(m_hModule);if (m_hModule == NULL){qDebug()<<"can not load xldl.dll -->";throw L"can not load xldl.dll";}_Init = (fn_Init) GetProcAddress(m_hModule, "XL_Init");_UnInit = (fn_UnInit) GetProcAddress(m_hModule, "XL_UnInit");_TaskCreate = (fn_TaskCreate) GetProcAddress(m_hModule, "XL_CreateTask");_TaskDelete = (fn_TaskDelete) GetProcAddress(m_hModule, "XL_DeleteTask");_TaskStart = (fn_TaskStart) GetProcAddress(m_hModule, "XL_StartTask");_TaskPause = (fn_StopTask) GetProcAddress(m_hModule, "XL_StopTask");_TaskForcePause = (fn_StopTask) GetProcAddress(m_hModule, "XL_ForceStopTask");_TaskQuery = (fn_TaskQuery) GetProcAddress(m_hModule, "XL_QueryTaskInfo");_TaskQueryEx = (fn_TaskQueryEx) GetProcAddress(m_hModule, "XL_QueryTaskInfoEx");_LimitSpeed = (fn_LimitSpeed) GetProcAddress(m_hModule, "XL_SetSpeedLimit");_LimitUploadSpeed = (fn_LimitUploadSpeed) GetProcAddress(m_hModule, "XL_SetUploadSpeedLimit");_DelTempFile = (fn_DelTempFile) GetProcAddress(m_hModule, "XL_DelTempFile");_SetProxy = (fn_SetProxy) GetProcAddress(m_hModule, "XL_SetProxy");_SetUserAgent = (fn_SetUserAgent) GetProcAddress(m_hModule, "XL_SetUserAgent");_GetFileSizeWithUrl = (fn_GetFileSizeWithUrl) GetProcAddress(m_hModule, "XL_GetFileSizeWithUrl");_ParseThunderPrivateUrl = (fn_ParseThunderPrivateUrl) GetProcAddress(m_hModule, "XL_ParseThunderPrivateUrl");_SetAdditionInfo = (fn_SetAdditionInfo) GetProcAddress(m_hModule, "XL_SetAdditionInfo");_SetFileIdAndSize = (fn_SetFileIdAndSize) GetProcAddress(m_hModule, "XL_SetFileIdAndSize");_CreateTaskByURL = (fn_CreateTaskByURL) GetProcAddress(m_hModule, "XL_CreateTaskByURL");_CreateTaskByThunder = (fn_CreateTaskByThunder) GetProcAddress(m_hModule, "XL_CreateTaskByThunder");_CreateBTTaskByThunder = (fn_CreateBTTaskByThunder) GetProcAddress(m_hModule, "XL_CreateBTTaskByThunder");CHECKFUNC(_Init, false);return _Init() == TRUE;
}
需要注意的是在不同版本中,所包含的方法函数也不一样,例如liebao_Thunder_Cloud 版就没有XL_CreateTaskByURL函数方法,
- 实际线程调用:
继承QThread类,重写void run() override;
方法,获取文件总大小,下载进度,下载有效字节数,即时速度,倒计时等信息,并通过信号槽控制下载的中断和退出。
void QThread_ThunderWrapper::run()
{emit IsStart(true);bool ISuccessed=false;IsQuit=false;QString Error="";try {qDebug()<<"QThread_ThunderWrapper Start!";thunderWrapper=new Lib_ThunderWrapper();bool ISuccessed=thunderWrapper->init();if(!ISuccessed)throw QString("Lib_ThunderWrapper 初始化失败!");elseqDebug()<<"thunderWrapper->init : Successed!";wchar_t * url=utf8_to_wchar(Urlpath.toStdString().c_str());wchar_t * path=utf8_to_wchar(Filepath.toStdString().c_str());wchar_t * fileName=utf8_to_wchar(Filename.toStdString().c_str());if(!thunderWrapper->CreateTaskByURL(url,path,fileName,TRUE)){thunderWrapper->unInit();throw QString("taskCreate 失败!");}elseqDebug()<<"thunderWrapper->taskCreate : Successed!";if(!thunderWrapper->taskStart()){thunderWrapper->taskDelete();thunderWrapper->unInit();throw QString("taskStart 失败!");}elseqDebug()<<"thunderWrapper->taskStart : Successed!";//! 1秒查询一次msleep(1000);DownTaskInfo stTaskInfo;while (!IsQuit) {if(thunderWrapper->taskQueryEx(stTaskInfo)){if(stTaskInfo.stat==TSC_ERROR){emit Current_status("下载失败!",TSC_ERROR);throw QString("TSC_ERROR: fail_code:%1").arg(stTaskInfo.fail_code);}else if(stTaskInfo.stat==TSC_PAUSE){emit Current_status("下载暂停!",TSC_PAUSE);}else if(stTaskInfo.stat==TSC_DOWNLOAD){emit Current_status("正在下载...",TSC_PAUSE);emit Down_Speed(stTaskInfo.nSpeed);emit ProgressBar((int)stTaskInfo.fPercent*100);emit SendDownsize(stTaskInfo.nTotalDownload,stTaskInfo.nTotalSize);if(stTaskInfo.nSpeed>0)emit Time_Remaining((stTaskInfo.nTotalSize-stTaskInfo.nTotalDownload)/stTaskInfo.nSpeed);}else if(stTaskInfo.stat==TSC_COMPLETE){ISuccessed=true;IsQuit=true;emit Current_status("下载完成",TSC_COMPLETE);emit Down_Speed(stTaskInfo.nSpeed);emit ProgressBar((int)stTaskInfo.fPercent*100);emit SendDownsize(stTaskInfo.nTotalDownload,stTaskInfo.nTotalSize);emit Time_Remaining(0);break;}else if(stTaskInfo.stat==TSC_STARTPENDING){emit Current_status("等待下载!",TSC_STARTPENDING);}else if(stTaskInfo.stat==TSC_STOPPENDING){emit Current_status("停止等待!",TSC_STARTPENDING);}
// qDebug().noquote()<<QString("\n state : %1 "
// "\n fail_code : %2"
// "\n nTotalSize : %3"
// "\n nTotalDownload : %4"
// "\n fPercent : %5"
// "\n nSrcTotal : %6"
// "\n nSrcUsing : %7"
// "\n nSpeed : %8"
// "\n szFilename : %9"
// "\n szSavePath : %10"
// "\n IsCreatingFile : %11"
// "\n bIsOriginUsable : %12 \n\n")
// .arg(stateStr)
// .arg(stTaskInfo.fail_code)
// .arg(QString::number(stTaskInfo.nTotalSize,10))
// .arg(QString::number(stTaskInfo.nTotalDownload,10))
// .arg(QString::number(stTaskInfo.fPercent))
// .arg(stTaskInfo.nSrcTotal)
// .arg(stTaskInfo.nSrcUsing)
// .arg(stTaskInfo.nSpeed)
// .arg(QString::fromWCharArray(stTaskInfo.szFilename))
// .arg(QString::fromWCharArray(stTaskInfo.szReserved0))
// .arg(stTaskInfo.IsCreatingFile?"TRUE":"FALSE")
// .arg(stTaskInfo.bIsOriginUsable?"TRUE":"FALSE")
// ;//! 1秒查询一次}msleep(1000);}}catch (QString error) {ISuccessed=false;Error="异常信息 :"+error;}catch (...) {}qDebug()<<"thunderWrapper unInit-->";thunderWrapper->unInit();//! 清除连接delete thunderWrapper;thunderWrapper=nullptr;emit IsStart(true);
}
如图所示:
下载在网上找到系统镜像文件时,ThunderOpenSDK下载速度更快, 能稳定到9mb/s左右,而通过原生的QNetworkReply下载最高在5Mb/s左右。
ThunderOpenSDK 下载问题
ThunderOpenSDK 无法下载包含重定向跳转的下载链接,
正当我打算整体改用ThunderOpenSDK下载时,我突然发现ThunderOpenSDK 无法下载项目中的资源文件,换成其他网上找的资源文件又能正常下载,
测试多次发现ThunderOpenSDK只能下载直接指向下载资源的链接,
包含重定向跳转的下载链接下载不了!
无解,果断放弃,还是改用调用Aria2下载!
不过一般的下载ThunderOpenSDK库也完全够用了。
相关文章:

Qt/C++ 调用迅雷开放下载引擎(ThunderOpenSDK)下载数据资源
目录导读 前言ThunderOpenSDK 简介参考 xiaomi_Thunder_Cloud 示例ThunderOpenSDK 下载问题 前言 在对以前老版本的exe执行程序进行研究学习的时候,发现以前的软件是使用的ThunderOpenSDK这个迅雷开放下载引擎进行的项目数据下载,于是在网上搜索一番找到…...
深入详解 Java - Spring MVC
在 Java 企业级开发领域,Spring MVC 是一个极为重要的框架,它为构建强大、灵活且高效的 Web 应用程序提供了坚实的基础。本文将深入详解 Java 之 Spring MVC,带你领略其强大之处。 一、Spring MVC 概述 Spring MVC 是 Spring 框架的一个重要模块,全称为 Spring Web Model-V…...

Spring Boot技术中小企业设备管理系统设计与实践
6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…...
动态渲染组件
引言 在现代前端开发中,动态渲染组件是一种常见的需求,特别是在构建复杂的应用程序时。动态渲染组件允许我们在运行时根据不同的条件或数据来决定渲染哪个组件,从而提高代码的灵活性和可维护性。本文将详细介绍如何在 Vue.js 中实现动态渲染…...

一个神秘的新图像生成模型red_panda出现 轻松击败Midjourney与OpenAI
一个神秘的新图像生成模型在众包人工分析基准测试中击败了 Midjourney、黑森林实验室和 OpenAI 的模型。这个名为"red_panda"的模型在人工分析的文本到图像排行榜上领先排名第二的黑森林实验室的 Flux1.1 Pro 约 40 个 Elo 分数。 Artificial Analysis 使用 Elo&…...

云计算平台上的DevOps实践
文章目录 什么是DevOps云计算平台上的DevOps优势自动化部署弹性伸缩地理分布 实施DevOps的关键组件版本控制系统持续集成/持续交付工具配置管理工具监控和日志管理 实践案例使用AWS CodePipeline进行持续集成/持续交付利用AWS Auto Scaling实现弹性使用AWS CloudFormation进行基…...
JS新功能之:全新 Set 方法
JavaScript 的内置Set类将新增一些方法,以便执行集合论中常见的操作,包括: Set.prototype.intersection(other):返回两个集合的交集。 Set.prototype.union(other):返回两个集合的并集。 Set.prototype.difference(o…...

Flume的安装配置
一、上传解压 tar -zxvf apache-flume-1.9.0-bin.tar.gz -C /usr/local/soft/#***在环境变量中增加如下命令,可以使用 soft 快速切换到 /usr/local/soft***alias softcd /usr/local/soft/ 二、配置环境变量 soft #重命名 mv apache-flume-1.9.0-bin/ flume-1.9.0…...
3.1.3 虚存页面的映射
3.1.3 虚存页面的映射 文章目录 3.1.3 虚存页面的映射3.1.3 虚存页面的映射MmCreateVirtualMapping()MmCreateVirtualMappingUnsafe()MiFlushTlb()MmDeleteVirtualMapping()MmPageOu…...

【SSM详细教程】-14-SpringAop超详细讲解
精品专题: 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…...

虚拟机桥接模式连不上,无法进行SSH等远程操作
说明:以下情况在window10上遇到,解决后顺便做了个笔记,以防后续再次用到,也给同道中人提供一个解决方案 一、首先按照以下步骤进行检查 1、是否连接了对应的wifi 2、是否设置了桥接模式 3、上述1、2确认无误的情况下请查看右上…...

jmeter基础01-1_环境准备-windows系统安装jdk
课程大纲 一、步骤解说 step1. jdk官网下载 Java Downloads | Oracle step2. 安装/解压(二选一) 1. 安装包格式(后缀.exe/.msi/.dmg):双击跟随界面向导安装,可以指定安装位置等。 2. 压缩包格式(后缀.z…...
第六天: C语言核心概念与实战技巧全解析
1 主函数(main) 大家好,今天我们来深入探讨一下C语言中非常特殊的一个函数——main函数。虽然大家对它并不陌生,但是它的重要性和特殊性值得我们再次回顾。 main函数的定义 main函数是我们整个C源程序的入口点。计算机在运行程…...

初始JavaEE篇——多线程(5):生产者-消费者模型、阻塞队列
找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏:JavaEE 文章目录 阻塞队列生产者—消费者模型生产者—消费者模型的优势:生产者—消费者模型的劣势: Java标准库中的阻…...

2024年下教师资格证面试报名详细流程❗
⏰ 重要时间节点: (一)下半年笔试成绩查询:11月8日10:00 (二)注册报名:11月8日10:00-11日18:00 (三)网上审核:11月8日10:00-11日18:00 (四&#x…...
软考:常用协议和端口号
常用协议及其对应的端口号如下: TCP/IP协议: TCP(传输控制协议):端口号为6UDP(用户数据报协议):端口号为17 网络应用协议: HTTP(超文本传输协议)…...

Linux更改符号链接
目录 1. 删除旧链接 2. 创建新的符号链接 例如我的电脑上有两个版本的cuda,11.8和12.4 1. 删除旧链接 rm cuda 2. 创建新的符号链接 ln -s /usr/local/cuda-11.8/ /usr/local/cuda...

int main(int argc,char* argv[])详解
#include <stdio.h> //argc 是指命令行输入参数的个数; //argv[]存储了所有的命令行参数, //arg[0]通常指向程序中的可执行文件的文件名。在有些版本的编译器中还包括程序文件所在的路径。 //如:"d:\Production\Software\VC_2005_Test\Win32控制台应用程序\Vc_T…...

单片机原理及应用笔记:C51流程控制语句与项目实践
作者介绍 周瑞康,男,银川科技学院,计算机人工智能学院,2022级计算机科学与技术8班本科生,单片机原理及应用课程第八组。 指导老师:王兴泽 电子邮箱2082545622qq.com 前言: 本篇文章是参考《…...

大数据日志处理框架ELK方案
介绍应用场景大数据ELK日志框架安装部署 一,介绍 大数据日志处理框架ELK(Elasticsearch、Logstash、Kibana)是一套完整的日志集中处理方案,以下是对其的详细介绍: 一、Elasticsearch(ES) 基本…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...