MFC文件和注册表的操作

MFC文件和注册表的操作

日志、操作配置文件、ini、注册表、音视频的文件存储

Linux下一切皆文件

C/C++操作文件

const char* 与 char* const

const char* 常量指针,表示指向的内容为常量。指针可以指向其他变量,但是内容不能再变了


char szName[6]="Bingo";
const char* pName = szName;
*pName = 'b';错误
//pName常量指针,表示指向的内容为常量。指针可以指向其他变量,但是内容不能再变了
-----------------------------------------------------
char szName[6]="Bingo";
char * const pName=szName;
char *p;错误
*pNmae = 'b';正确
//表示pName是指针常量;表示地址是常量。不能再变了。但是内容可以改变

C语言操作文件

_Check_return_wat_
_Success_(return == 0)
_ACRTIMP errno_t __cdecl fopen_s(_Outptr_result_nullonfailure_ FILE** _Stream,_In_z_                   char const* _FileName,_In_z_                   char const* _Mode //文件打开方式
);
  • 文件打开的模式
    • 'r’模式:这是“只读”模式。如果文件不存在,尝试打开将失败。文件指针位于文件开头,不会清空文件原有内容。
    • 'w’模式:这是“只写”模式。如果文件存在,它将被清空并从头开始写入;如果文件不存在,将创建一个新文件。文件指针位于文件开头。
    • 'a’模式:**这是“追加”模式。如果文件存在,写入的数据将添加到文件末尾,不会清空原有内容;**如果文件不存在,将创建一个新文件。文件指针位于文件结尾。
    • 'r+'模式:这是“读写”模式。文件必须存在,文件指针位于文件开头。可以在文件任意位置读取或写入内容,写入操作会覆盖原有位置的内容。
    • 'w+'模式:这也是“读写”模式。它类似于’w’模式,但是它允许读取操作。打开文件后,会清空文件内原有的内容。
    • 'a+'模式:这同样是“读写”模式。它类似于’a’模式,但是它允许读取操作。写入内容时,只会追加在文件尾部。
_Check_return_opt__ACRTIMP size_t __cdecl fwrite(_In_reads_bytes_(_ElementSize * _ElementCount)       void     const*        _Buffer,_In_     size_t        _ElementSize,//一个元素的字节数_In_     size_t        _ElementCount,//元素个数_Inout_  FILE*         _Stream
);

对于宽字节而言 wchar a[20] = “bingo”;

ANSI char a[20]=“bingo”;

fseek(//文件指针的定位_Inout_ FILE* _Stream, //指向FILE结构体指针_In_    long  _Offset, //偏移量_In_    int   _Origin  //指定文件指针的起始位置//SEEK_CUR 当前位置,//SEEK_END 文件结尾位置 //SEEK_SET文件开始位置
);
Ftell 返回文件指针的当前位置
  • 文件操作

    void CMyMFCFileView::OnFileWrite()
    {FILE* pFile = NULL;//打开文件errno_t err = _wfopen_s(&pFile, _T("1.txt"),_T("w"));if (err == 0){MessageBox(_T("Open Success!!"));}else{TRACE("Open Failed ErrorCode = %d", GetLastError());return;}//fwrite()//WCHAR a[20] = L"bingo";//宽字节而言 一个元素的字节数是2//   char a1[20] = "bingo";//ANSI        一个元素的字节数是1//TRACE("*************a = %d, a1 = %d", sizeof(a), sizeof(a1)); //40,20//fwrite("Bingo", 1, strlen("bingo"), pFile);fwrite(L"Bingo", 2, wcslen(_T("bingo")) + 1, pFile);//宽字节fclose(pFile);}void CMyMFCFileView::OnFileRead()
    {FILE* pFile = NULL;//打开文件errno_t err = _wfopen_s(&pFile, _T("1.txt"), _T("r"));if (err != 0){TRACE("Open Failed ErrorCode = %d", GetLastError());return;}
    #if 0WCHAR pBuf[100] = { 0 };//长度是未知的!!!fread(pBuf,2,100,pFile);MessageBox(pBuf);
    #endiffseek(pFile,0,SEEK_END);//偏移到结尾位置int len = ftell(pFile); //文件指针的当前位置(文件长度)WCHAR* pBuf = new WCHAR[len + 1];fseek(pFile, 0, SEEK_SET);//偏移到起始位置//rewind(pFile);//将文件指针重新放到文件开始处pBuf[len] = 0;//确保数组最后一个元素为'\0'fread(pBuf, 2, len, pFile);//从指针位置开始读MessageBox(pBuf);fclose(pFile);}
    

C++操作文件

ofstream

explicit basic_ofstream(const char* _Filename, ios_base::openmode _Mode = ios_base::out,int _Prot = ios_base::_Default_open_prot)
#include <io.h>
#include <fstream>
using namespace std;void CMyMFCFileView::OnFileWrite()
{ofstream ofs("2.txt"); //第一个参数表示文件名,2打开方式ofs.write("BingoC++", strlen("BingoC++"));ofs.close();
}void CMyMFCFileView::OnFileRead()
{ifstream ifs("2.txt");char pBuf[100] = { 0 };ifs.read(pBuf, 100);USES_CONVERSION;CString str = A2W(pBuf);MessageBox(str); ifs.close();
}

Win32 API/MFC操作文件

CreateFile

文件、管道、邮槽 通信资源、磁盘设备、控制台、目录

CreateFileW(LPCWSTR lpFileName,   //创建或打开的对象的名称DWORD dwDesiredAccess,	//访问方式 读、读写、写、查询 0 GENERIC_READ,GENERIC_WRITEDWORD dwShareMode,		//共享方式 0 LPSECURITY_ATTRIBUTES lpSecurityAttributes, //NULL,安全权限,不能被子进程继承DWORD dwCreationDisposition,	//如何创建文件 CREATE_NEW CREATE_ALWAYSDWORD dwFlagsAndAttributes,	//设置文件的属性和标志HANDLE hTemplateFile		//NULL);WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,		//要写入的字节数LPDWORD lpNumberOfBytesWritten,	//用来接收实际写入到文件的字节数LPOVERLAPPED lpOverlapped
);
ReadFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead,LPOVERLAPPED lpOverlapped
);

Win32 API 操作文件

void CMyMFCFileView::OnFileWrite()
{HANDLE hFile;hFile = CreateFile(_T("3.txt"), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE){TRACE("INVALID_HANDLE_VALUE, ERRORCODE = %d", GetLastError());return;}DWORD dwWrites;WriteFile(hFile, "BingoWin32API", strlen("BingoWin32API"), &dwWrites, NULL);TRACE("###dwWrite = %d", dwWrites);CloseHandle(hFile);}void CMyMFCFileView::OnFileRead()
{HANDLE hFile;hFile = CreateFile(_T("3.txt"), GENERIC_READ, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);//读数据、已存在的char pBuf[100] = { 0 };DWORD dwReads;ReadFile(hFile, pBuf, 100, &dwReads, NULL);TRACE("###dwReads = %d", dwReads);CloseHandle(hFile);
}

MFC操作文件

void CMyMFCFileView::OnFileWrite()
{//CFile(LPCTSTR lpszFileName, UINT nOpenFlags);  文件名、CFile file(L"4.txt", CFile::modeCreate | CFile::modeWrite);file.Write("BingoMFC", strlen("BingoMFC"));file.Close();}void CMyMFCFileView::OnFileRead()
{CFile file(L"4.txt", CFile::modeRead);char* pBuf;DWORD dwFileLen = file.GetLength();pBuf = new char[dwFileLen + 1];pBuf[dwFileLen] = 0;file.Read(pBuf, dwFileLen);file.Close();USES_CONVERSION;CString str = A2W(pBuf);MessageBox(str);
}
基于文件对话框的读写

派生关系:CFileDialog -> CCommonDialog -> CDialog -> CWnd -> CCmdTarget -> CObject

CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAsLPCTSTR lpszDefExt = NULL,LPCTSTR lpszFileName = NULL,DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,LPCTSTR lpszFilter = NULL,CWnd* pParentWnd = NULL,DWORD dwSize = 0,BOOL bVistaStyle = TRUE); 
void CMyMFCFileView::OnFileWrite()
{// 	CFileDialog(BOOL bOpenFileDialog,	// TRUE for 构建一个打开的对话框, FALSE for 构建一个保存对话框
// 		LPCTSTR lpszDefExt = NULL,		// 指定默认的文件扩展名 NULL
// 		LPCTSTR lpszFileName = NULL,	// 初始文件名 NULL 默认没有初始文件名
// 		DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
// 		LPCTSTR lpszFilter = NULL,		//用来指定一个或一组文件的过滤器
// 		CWnd * pParentWnd = NULL,		//用来指定文件对话框的父窗口或者拥有窗口
// 		DWORD dwSize = 0,				//大小
// 		BOOL bVistaStyle = TRUE);		//可见或者不可见CFileDialog fileDlg(FALSE);fileDlg.m_ofn.lpstrTitle = L"Bingo"; //该窗口标题fileDlg.m_ofn.lpstrFilter = _T("Text Files (*.txt)");fileDlg.m_ofn.lpstrDefExt = L"txt";//默认保存类型//fileDlg.DoModal();if (IDOK == fileDlg.DoModal()){CFile file(fileDlg.GetFileName(), CFile::modeCreate | CFile::modeWrite);USES_CONVERSION;char* szBuf = T2A(fileDlg.GetFileName());TRACE("####fileDlg.GetFileName() = %s", szBuf);file.Write("BingoMFC111", strlen("BingoMFC111"));file.Close();}
}void CMyMFCFileView::OnFileRead()
{
// 	CFileDialog(BOOL bOpenFileDialog,	// TRUE for 构建一个打开的对话框, FALSE for 构建一个保存对话框
// 		LPCTSTR lpszDefExt = NULL,		// 指定默认的文件扩展名 NULL
// 		LPCTSTR lpszFileName = NULL,	// 初始文件名 NULL 默认没有初始文件名
// 		DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
// 		LPCTSTR lpszFilter = NULL,		//用来指定一个或一组文件的过滤器
// 		CWnd * pParentWnd = NULL,		//用来指定文件对话框的父窗口或者拥有窗口
// 		DWORD dwSize = 0,				//大小
// 		BOOL bVistaStyle = TRUE);		//可见或者不可见CFileDialog fileDlg(TRUE);fileDlg.m_ofn.lpstrTitle = L"Bingo"; //该窗口标题fileDlg.m_ofn.lpstrFilter = _T("Chart Files (*.xlc)|*.xlc|")_T("Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|")_T("*.xlc; *.xls|All Files (*.*)|*.*||"); //该窗口标题//fileDlg.DoModal();if (IDOK == fileDlg.DoModal()){CFile file(fileDlg.GetFileName(), CFile::modeRead);char* pBuf;DWORD dwFileLen = file.GetLength();pBuf = new char[dwFileLen + 1];pBuf[dwFileLen] = 0;file.Read(pBuf, dwFileLen);file.Close();USES_CONVERSION;CString	 szBuf = A2W(pBuf);MessageBox(szBuf);}}

配置文件的访问与读写

[metadata]
title=搜狗双拼
[声母]
ch=I
sh=U
void CMyMFCFileView::OnWriteConfig()
{// TODO: 在此添加命令处理程序代码//获得当前路径WCHAR strPath[MAX_PATH] = { 0 };GetCurrentDirectoryW(MAX_PATH, strPath);TRACE("333strPath = %s", strPath);// 当前路径: E:\奇牛培训\学习笔记\mfc\MyMFCFile\ + Test.iniCString strFilePath;strFilePath.Format(L"%ls//Test.ini", strPath);WritePrivateProfileStringW(L"metadata", L"title", L"搜狗双拼", strFilePath);WritePrivateProfileStringW(L"声母", L"ch", L"I", strFilePath);WritePrivateProfileStringW(L"声母", L"sh", L"U", strFilePath);
}void CMyMFCFileView::OnReadConfig()
{	//获得当前路径WCHAR strPath[MAX_PATH] = { 0 };WCHAR strTitle[MAX_PATH] = { 0 }; WCHAR strCh[MAX_PATH] = { 0 };WCHAR strSh[MAX_PATH] = { 0 };GetCurrentDirectoryW(MAX_PATH, strPath);TRACE("333strPath = %s", strPath);// 当前路径: E:\奇牛培训\学习笔记\mfc\MyMFCFile\ + Test.iniCString strFilePath;strFilePath.Format(L"%ls//Test.ini", strPath);DWORD dwNum1 = GetPrivateProfileStringW(L"metadata", L"title", NULL, strTitle, MAX_PATH, strFilePath);DWORD dwNum2 = GetPrivateProfileStringW(L"声母", L"ch", NULL, strCh, MAX_PATH, strFilePath);DWORD dwNum3 = GetPrivateProfileStringW(L"声母", L"sh", NULL, strSh, MAX_PATH, strFilePath);TRACE("dwNum1 = %d,dwNum2 = %d,dwNum3 = %d", dwNum1, dwNum2, dwNum3);USES_CONVERSION;char* szTitle = W2A(strTitle);char* szCh = W2A(strCh);char* szSh = W2A(strSh);TRACE("strTitle = %s,strCh = %s,strSh = %s", szTitle, szCh, szSh);
}

注册表编程

注册表API

注册表 存储在二进制文件里面,win32API提供了大量的函数操作注册表

注册表:Win+R组合键 regedit

注册表读写

write

	RegCreateKeyW(_In_ HKEY hKey,				//打开的当前项的句柄 实际上就是那几个分支_In_opt_ LPCWSTR lpSubKey,	//打开或者创建的表项的名称_Out_ PHKEY phkResult		//用来接收创建或者打开表项句柄 regclose);RegOpenKeyW(_In_ HKEY hKey,_In_opt_ LPCWSTR lpSubKey,_Out_ PHKEY phkResult);//写入注册表RegSetValueW(_In_ HKEY hKey,				//打开的当前项的句柄 实际上就是那几个分支_In_opt_ LPCWSTR lpSubKey,	//打开或者创建的表项的名称_In_ DWORD dwType,			//只是被存储信息的类型 REG_SZ类型_In_reads_bytes_opt_(cbData) LPCWSTR lpData,	//要存放到注册表里面的数据_In_ DWORD cbData			//要存放的字符串数据的大小、长度);RegSetValueExW(_In_ HKEY hKey,				//打开的当前项的句柄 实际上就是那几个分支_In_opt_ LPCWSTR lpValueName,//指向一个字符串的指针,包含了将要设置值的名称_Reserved_ DWORD Reserved,	//保留参数	0_In_ DWORD dwType,			//REG_BINARY_In_reads_bytes_opt_(cbData) CONST BYTE * lpData,_In_ DWORD cbData);

·read

	RegQueryValueW(_In_ HKEY hKey,					//打开的当前项的句柄 实际上就是那几个分支_In_opt_ LPCWSTR lpSubKey,_Out_writes_bytes_to_opt_(*lpcbData, *lpcbData) __out_data_source(REGISTRY) LPWSTR lpData,_Inout_opt_ PLONG lpcbData);
--------------管理员身份运行--------------------
----------------------------------------------
void CMyMFCFileView::OnWriteReg()
{HKEY hKey;DWORD dwAge = 39;//创建注册表项   管理员权限运行int ret = ::RegCreateKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Rock\\admin", &hKey);//写注册表if(ret != ERROR_SUCCESS){TRACE("RegCreateKeyW Failed, ErrorCode = %d", GetLastError());MessageBox(L"创建注册表失败");return;}//写注册表 ::RegSetValueEx(hKey, L"age", 0, REG_DWORD, (CONST BYTE*) & dwAge, 4);::RegCloseKey(hKey);
}void CMyMFCFileView::OnReadReg()
{HKEY hKey;DWORD dwAge;//创建注册表项   管理员权限运行int ret = ::RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Rock\\admin", &hKey);//写注册表if (ret != ERROR_SUCCESS){TRACE("RegOpenKeyW Failed, ErrorCode = %d", GetLastError());MessageBox(L"打开注册表失败");return;}//写注册表 DWORD dwType;DWORD dwValue;::RegQueryValueEx(hKey, L"age", 0, &dwType, (LPBYTE) & dwAge,&dwValue);TRACE("####dwType = %d, dwValue = %d, dwAge = %d", dwType, dwValue, dwAge);::RegCloseKey(hKey);
}

文件操作的企业级应用

1、调试日志 debugview 文件日志:警告日志 错误日志

2、视频存储

3、文件传输 CFile 与 socket 结合使用

4、C语言和MFC的文件操作用途广泛;win32API少用 ifstream ofstream

5、配置文件 windows

6、注册表的操作 病毒 逆向 操作注册表

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

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

相关文章

微信小程序源码逆向 MacOS

前言 日常工作中经常会遇到对小程序的渗透测试&#xff0c;微信小程序的源码是保存在用户客户端本地&#xff0c;在渗透的过程中我们需要提取小程序的源码进行问题分析&#xff0c;本篇介绍如何在苹果电脑 MacOS 系统上提取微信小程序的源码。 0x01 微信小程序提取 在苹果电…

ubuntu-24.04.1-desktop 中安装 QT6.7

ubuntu-24.04.1-desktop 中安装 QT6.7 1 环境准备1.1 安装 GCC 和必要的开发包:1.2 Xshell 连接 Ubuntu2 安装 Qt 和 Qt Creator:2.1 下载在线安装器2.2 在虚拟机中为文件添加可执行权限2.3 配置镜像地址运行安装器2.4 错误:libxcb-xinerama.so.0: cannot open shared objec…

告别 Freetype,拥抱高效字体处理新方案 - 纯c#解析字体库

在当今数字化的时代&#xff0c;字体处理在众多领域中都扮演着至关重要的角色&#xff0c;无论是平面设计、网页开发&#xff0c;还是移动应用、游戏制作&#xff0c;合适的字体选择与精准的处理都能极大地提升用户体验。而在字体处理的技术领域&#xff0c;Freetype 库一直是开…

React + TypeScript 复杂布局开发实战

React TypeScript 复杂布局开发实战 一、项目架构设计&#xff08;基于最新技术栈&#xff09; 1.1 技术选型与工程创建 # 使用Vite 5.x React 19 TypeScript 5.4 npx create-vitelatest power-designer-ui --template react-ts cd power-designer-ui && npm inst…

从最小依赖角度谈静态库与动态库的选择及配置策略

文章目录 1. 前言2. 静态库与动态库&#xff1a;依赖最小化的抉择2.1 静态库概述2.2 动态库概述2.3 依赖最小化角度的选择建议 3. 运行时库配置策略&#xff1a;/MT 与 /MD 的取舍3.1 /MT 与 /MD 的优劣比较3.2 配置选择的建议 4. 实际案例与配置示例4.1 静态库示例&#xff08…

深度学习pytorch之19种优化算法(optimizer)解析

提示&#xff1a;有谬误请指正 摘要 本博客详细介绍了多种常见的深度学习优化算法&#xff0c;包括经典的LBFGS 、Rprop 、Adagrad、RMSprop 、Adadelta 、ASGD 、Adamax、Adam、AdamW、NAdam、RAdam以及SparseAdam等&#xff0c;通过对这些算法的公式和参数说明进行详细解析…

【深度学习神经网络学习笔记(二)】神经网络基础

神经网络基础 神经网络基础前言1、Logistic 回归2、逻辑回归损失函数3、梯度下降算法4、导数5、导数计算图6、链式法则7、逻辑回归的梯度下降 神经网络基础 前言 Logistic 回归是一种广泛应用于统计学和机器学习领域的广义线性回归模型&#xff0c;主要用于解决二分类问题。尽…

002简单MaterialApp主题和Scaffold脚手架

002最简单的MaterialApp主题和Scaffold脚手架使用导航栏_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1RZ421p7BL?spm_id_from333.788.videopod.episodes&vd_source68aea1c1d33b45ca3285a52d4ef7365f&p1501.MaterialApp纯净的 /*MaterialApp 是主题,自带方向设…

DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!

项目地址&#xff1a;GitHub - deepseek-ai/FlashMLA 开源日历&#xff1a;2025-02-24起 每日9AM(北京时间)更新&#xff0c;持续五天&#xff01; ​ 一、开源周震撼启幕 继上周预告后&#xff0c;DeepSeek于北京时间今晨9点准时开源「FlashMLA」&#xff0c;打响开源周五连…

17.C++类型转换

1. C语言中的类型转换 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&#xff0c;或者返回值类型与接收返回值类型不一致时&#xff0c;就需要发生类型转换&#xff0c;C语言中共有两种形式的类型转换&#xff1a;隐式类型转换和显…

springboot志同道合交友网站设计与实现(代码+数据库+LW)

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本志同道合交友网站就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在短时间内处理完毕庞大的数据信…

VMware中的linux常用指令

常用 Linux 基础命令 文件与目录操作 ls&#xff1a;查看当前目录的文件和子目录&#xff0c;ls -a显示所有文件&#xff0c;包括隐藏文件。cd&#xff1a;切换目录&#xff0c;如 **cd ~** 切换到个人家目录。pwd&#xff1a;查看当前目录。mkdir&#xff1a;创建文件夹&#…

20250212:https通信

1:防止DNS劫持:使用 https 进行通信。 因为是SDK授权开发,需要尽量压缩so库文件和三方依赖。所以第一想法是使用 head only 的 cpp-httplib 进行开发。 cpp-httplib 需要 SSL 版本是 3.0及以上。但本地已经在开发使用的是1.0.2a版本,不满足需求。 方案1:升级OpenSSL 将Op…

VisionPro-PMA工具

VisionPro-PMA工具 模板匹配的核心概念 康耐视(Cognex)的VisionPro是一款广泛应用工业自动化的机器视觉软件平台&#xff0c;其模板匹配(Pattern Matching)功能是核心工具之一&#xff0c;常用与目标定位、特征识别和质量检测等场景。 模板匹配&#xff1a;通过预先定义的参…

2025最新最全【大模型学习路线规划】零基础入门到精通_大模型 开发 学习路线

第一阶段&#xff1a;基础理论入门 目标&#xff1a;了解大模型的基本概念和背景。 内容&#xff1a; 人工智能演进与大模型兴起。 大模型定义及通用人工智能定义。 GPT模型的发展历程。 第二阶段&#xff1a;核心技术解析 目标&#xff1a;深入学习大模型的关键技术和工…

使用CSS3DRenderer/CSS2DRenderer给模型上面添加html标签

先放一下预览图 主要使用css2dRender和css3dRender&#xff0c;添加图片和标签。 思路&#xff1a;使用css3dRender添加一个图片&#xff0c;然后获取的位置坐标&#xff0c;使用css3dRender添加一个文字标签&#xff0c;也设置这个位置坐标&#xff0c;此外z轴设置一个高度&a…

完美隐藏滚动条方案 (2024 最新验证)

完美隐藏滚动条方案 (2024 最新验证) css /* 全局隐藏竖直滚动条但保留滚动功能 */ html {overflow: -moz-scrollbars-none; /* Firefox 旧版 */scrollbar-width: none; /* Firefox 64 */-ms-overflow-style: none; /* IE/Edge */overflow-y: overlay; …

Linux 内核配置机制详细讲解

本文是对 Linux 内核配置机制 make menuconfig 的 超详细分步解析&#xff0c;涵盖其工作原理、界面操作、配置逻辑及底层实现&#xff1a; 一、内核配置系统概述 Linux 内核的配置系统是一个 基于文本的交互式配置工具链&#xff0c;核心目标是通过定义 CONFIG_XXX 宏来控制内…

视频裂变加群推广分享引流源码

源码介绍 视频裂变加群推广分享引流源码 最近网上很火&#xff0c;很多人都在用&#xff0c;适合引流裂变推广 测试环境&#xff1a;PHP7.4(PHP版本不限制) 第一次访问送五次观看次数&#xff0c;用户达到观看次数后需要分享给好友或者群,好友必须点击推广链接后才会增加观看次…

python-leetcode-每日温度

739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; class Solution:def dailyTemperatures(self, temperatures: List[int]) -> List[int]:n len(temperatures)answer [0] * nstack [] # 存储索引for i, temp in enumerate(temperatures):while stack and temperat…