C#针对kernel32.dll的一些常规使用
1、前言
Window是一个复杂的系统,kernel32是一个操作系统的核心动态链接库文件。它提供了大量的API函数,提供了操作系统的基本功能。
2、Ini使用
Ini文件读写使用时,我们需要用到其中的一些函数对文件进行读写。
API:
/// <summary>/// 获取所有节点名称(Section)/// </summary>/// <param name="lpszReturnBuffer">存放节点名称的内存地址,每个节点之间用\0分隔</param>/// <param name="nSize">内存大小(characters)</param>/// <param name="lpFileName">Ini文件</param>/// <returns>内容的实际长度,为0表示没有内容,为nSize-2表示内存大小不够</returns>[DllImport("kernel32.dll", CharSet = CharSet.Auto)]private static extern uint GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer, uint nSize, string lpFileName);/// <summary>/// 获取某个指定节点(Section)中所有KEY和Value/// </summary>/// <param name="lpAppName">节点名称</param>/// <param name="lpReturnedString">返回值的内存地址,每个之间用\0分隔</param>/// <param name="nSize">内存大小(characters)</param>/// <param name="lpFileName">Ini文件</param>/// <returns>内容的实际长度,为0表示没有内容,为nSize-2表示内存大小不够</returns>[DllImport("kernel32.dll", CharSet = CharSet.Auto)]private static extern uint GetPrivateProfileSection(string lpAppName, IntPtr lpReturnedString, uint nSize, string lpFileName);/// <summary>/// 读取INI文件中指定的Key的值/// </summary>/// <param name="lpAppName">节点名称。如果为null,则读取INI中所有节点名称,每个节点名称之间用\0分隔</param>/// <param name="lpKeyName">Key名称。如果为null,则读取INI中指定节点中的所有KEY,每个KEY之间用\0分隔</param>/// <param name="lpDefault">读取失败时的默认值</param>/// <param name="lpReturnedString">读取的内容缓冲区,读取之后,多余的地方使用\0填充</param>/// <param name="nSize">内容缓冲区的长度</param>/// <param name="lpFileName">INI文件名</param>/// <returns>实际读取到的长度</returns>[DllImport("kernel32.dll", CharSet = CharSet.Auto)]private static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, [In, Out] char[] lpReturnedString, uint nSize, string lpFileName);//另一种声明方式,使用 StringBuilder 作为缓冲区类型的缺点是不能接受\0字符,会将\0及其后的字符截断,//所以对于lpAppName或lpKeyName为null的情况就不适用[DllImport("kernel32.dll", CharSet = CharSet.Auto)]private static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);//再一种声明,使用string作为缓冲区的类型同char[][DllImport("kernel32.dll", CharSet = CharSet.Auto)]private static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, string lpReturnedString, uint nSize, string lpFileName);/// <summary>/// 将指定的键值对写到指定的节点,如果已经存在则替换。/// </summary>/// <param name="lpAppName">节点,如果不存在此节点,则创建此节点</param>/// <param name="lpString">Item键值对,多个用\0分隔,形如key1=value1\0key2=value2/// <para>如果为string.Empty,则删除指定节点下的所有内容,保留节点</para>/// <para>如果为null,则删除指定节点下的所有内容,并且删除该节点</para>/// </param>/// <param name="lpFileName">INI文件</param>/// <returns>是否成功写入</returns>[DllImport("kernel32.dll", CharSet = CharSet.Auto)][return: MarshalAs(UnmanagedType.Bool)] //可以没有此行private static extern bool WritePrivateProfileSection(string lpAppName, string lpString, string lpFileName);/// <summary>/// 将指定的键和值写到指定的节点,如果已经存在则替换/// </summary>/// <param name="lpAppName">节点名称</param>/// <param name="lpKeyName">键名称。如果为null,则删除指定的节点及其所有的项目</param>/// <param name="lpString">值内容。如果为null,则删除指定节点中指定的键。</param>/// <param name="lpFileName">INI文件</param>/// <returns>操作是否成功</returns>[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)][return: MarshalAs(UnmanagedType.Bool)]private static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);
调用函数包装:
/// <summary>/// 读取INI文件中指定KEY的字符串型值/// </summary>/// <param name="iniFile">Ini文件</param>/// <param name="section">节点名称</param>/// <param name="key">键名称</param>/// <param name="defaultValue">如果没此KEY所使用的默认值</param>/// <returns>读取到的值</returns>public static string INIGetStringValue(string iniFile, string section, string key, string defaultValue){string value = defaultValue;const int SIZE = 5120;if (string.IsNullOrEmpty(section)){throw new ArgumentException("必须指定节点名称", "section");}if (string.IsNullOrEmpty(key)){throw new ArgumentException("必须指定键名称(key)", "key");}StringBuilder sb = new StringBuilder(SIZE);uint bytesReturned = GetPrivateProfileString(section, key, defaultValue, sb, SIZE, iniFile);if (bytesReturned != 0){value = sb.ToString();}return value;}/// <summary>/// 在INI文件中,指定节点写入指定的键及值。如果已经存在,则替换。如果没有则创建。/// </summary>/// <param name="iniFile">INI文件</param>/// <param name="section">节点</param>/// <param name="key">键</param>/// <param name="value">值</param>/// <returns>操作是否成功</returns>public static bool INIWriteValue(string iniFile, string section, string key, string value){if (string.IsNullOrEmpty(section)){throw new ArgumentException("必须指定节点名称", "section");}if (string.IsNullOrEmpty(key)){throw new ArgumentException("必须指定键名称", "key");}if (value == null){throw new ArgumentException("值不能为null", "value");}return WritePrivateProfileString(section, key, value, iniFile);}
3、动态DLL加载
动态加载c++DLL方式,通过动态获取函数针对转换为C#的委托,可以实现动态。
API声明:
public static class DyLoadingDll{[DllImport("kernel32.dll")]public static extern IntPtr LoadLibrary(string lpFileName);[DllImport("kernel32.dll")]public static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);[DllImport("kernel32", EntryPoint = "FreeLibrary", SetLastError = true)]public static extern bool FreeLibrary(IntPtr hModule);public static Delegate GetFunctionAddress(IntPtr dllModule, string functionName, Type t){IntPtr address = GetProcAddress(dllModule, functionName);if (address == IntPtr.Zero)return null;elsereturn Marshal.GetDelegateForFunctionPointer(address, t);}}
调用示例:
IntPtr hSdkDll = LoadLibrary("MyCamera.dll");
CameraSdkInit = (pfnCameraSdkInit)GetFunctionAddress(hSdkDll, "CameraSdkInit", typeof(pfnCameraSdkInit));
4、其他
[DllImport("kernel32.dll")]private static extern bool Beep(int frequency, int duration);//声音[DllImport("kernel32.dll")]private static extern bool GetSystemPowerStatus(ref SystemPowerStatus systemPowerStatus);//电源管理[DllImport("kernel32.dll")]public static extern IntPtr GetCurrentProcess();[DllImport("kernel32.dll")]public static extern IntPtr SetProcessAffinityMask(IntPtr handle, IntPtr affinityMask);public void Beep(){Random random = new Random();for (int i = 0; i < 10000; i++){Beep(random.Next(100000), 100);}}public string GetProwerSatus(){SystemPowerStatus status = new SystemPowerStatus();GetSystemPowerStatus(ref status);string info = string.Format($"供电状况: {status.ACLineStatus} \n 剩余时间: {status.batteryFullLifeTime} \n 电力剩余: {status.batteryLifePercent} ");return info;}
public struct SystemPowerStatus{public ACLineStatus ACLineStatus;public BatteryFlag batteryFlag;public byte batteryLifePercent;public byte reserved1;public int batteryLifeTime;public int batteryFullLifeTime;}public enum ACLineStatus : byte{Offine = 0,Online=1,Unknown=255,}public enum BatteryFlag:byte{Hight =1,Low =2,Critical=4,Charging=8,NoSystemBattery=128,Unknown=255,}// 设置亲和性IntPtr newAffinity = new IntPtr(affinityMask);SetProcessAffinityMask(processHandle, newAffinity);
其他一些使用可以在实际需要去查找,它的函数比较多,可能有一个就是你需要的。
相关文章:

C#针对kernel32.dll的一些常规使用
1、前言 Window是一个复杂的系统,kernel32是一个操作系统的核心动态链接库文件。它提供了大量的API函数,提供了操作系统的基本功能。 2、Ini使用 Ini文件读写使用时,我们需要用到其中的一些函数对文件进行读写。 API: /// &l…...

电话营销机器人的优势
在人工智能的新趋势下,企业开始放弃传统外呼系统,转而使用电话销售机器人,那么使用机器人比坐席手动外呼好吗,真的可以代替人工坐席外呼吗,效率真的高吗? 1、 真人式语音 电话销售人员可以将自定义的话术…...

Oracle SQL Developer 连接第三方数据库
首先Oracle SQL Developer除了支持连接Oracle数据库外,还支持连接第三方数据库,包括: Amazon RedshiftHiveIBM DB2MySQLMicrosoft SQL ServerSybase Adaptive ServerPostgreSQLTeradataTimesTen 首先,你需要在菜单Tools > Pr…...

OSPF路由协议多区域
一、OSPF路由协议单区域的弊端 1、LSDB庞大,占用内存大,SPF计算开销大; 2、LSA洪泛范围大,拓扑变化影响范围大; 3、路由不能被汇总,路由表庞大,查找路由开销大。 二、如何解决OSPF单区域的问题? 引入划分区域 1、每个区域独立存储LSDB,划分区域减小了LSDB。 2、…...

8.5 C++
思维导图 试编程 提示并输入一个字符串,统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include <array>using namespace std;int main() {cout << "请输入一个字符…...

MySQL —— 初始数据库
数据库概念 在学习数据库之前,大家保存数据要么是在程序运行期间,例如:在学习编程语言的时候,大家写过的管理系统,运用一些简单的数据结构(例如顺序表)来组织数据,可是程序一旦结束…...

【JVM】垃圾回收机制、算法和垃圾回收器
什么是垃圾回收机制 为了让程序员更加专注于代码的实现,而不用过多的考虑内存释放的问题,所以在Java语言中,有了自动的垃圾回收机制,也是我们常常提及的GC(Garbage Collection) 有了这个垃圾回收机制之后,程序员只需…...

大数据资源平台建设可行性研究方案(58页PPT)
方案介绍: 在当今信息化高速发展的时代,大数据已成为推动各行各业创新与转型的关键力量。为了充分利用大数据的潜在价值,构建一个高效、安全、可扩展的大数据资源平台显得尤为重要。通过本方案的实施企业可以显著提升数据处理能力、优化资源配置、促进业…...

PHP教育培训小程序系统源码
🚀【学习新纪元】解锁教育培训小程序的无限可能✨ 📚 引言:教育培训新风尚,小程序来引领! Hey小伙伴们,是不是还在为找不到合适的学习资源而烦恼?或是厌倦了传统教育模式的单调?今…...

吴恩达机器学习笔记
1.机器学习定义: 机器学习就是让机器从大量的数据集中学习,进而得到一个更加符合现实规律的模型,通过对模型的使用使得机器比以往表现的更好 2.监督学习: 从给定的训练数据集中学习出一个函数(模型参数)…...

React和Vue3 的 Diff 算法有什么区别
React 和 Vue 3 的 Diff 算法都有相似的目标,即在组件状态或属性变化时高效地更新 DOM,但它们在实现细节上有所不同。以下是 React 和 Vue 3 的 Diff 算法的主要区别: React 的 Diff 算法 1. 同层比较 React 使用的是同层比较策略…...

【vulhub靶场之rsync关】
一、使用nmap模块查看该ip地址有没有Rsync未授权访问漏洞 nmap -p 873 --script rsync-list-modules 加IP地址 查看到是有漏洞的模块的 二、使用rsync命令连接并读取文件 查看src目录里面的信息。 三、对系统中的敏感文件进行下载——/etc/passwd 执行命令: rsy…...

全球7大高质量海外代理IP对比大全
随着国内市场逐渐饱和,越来越多朋友私信我说打算开拓海外市场这片蓝海了!海外代理IP作为解决这些需求的有效工具,帮助跨境企业或团队进行社媒管理、电商运营、市场调研、抓取数据、广告验证等等业务。但是,市场上提供的代理IP服务…...

对于原型链的理解
1.同一个构造函数的多个实例之间 无法共享属性(创建多个实例的时候会造成资源浪费) function Cat(name, color) {this.name name;this.color color;this.meow function () {console.log(miao);}; }var cat1 new Cat(LH, White); var cat2 new Cat(…...

Web开发:Vue中的事件小结
一、全选按钮checkbox <template><div id"checkboxs"><label><input id"selectAll" type"checkbox" v-model"selectAllChecked" change"selectAllItems">全部</label><label v-for"…...

基于Springboot的运行时动态可调的定时任务
配置类 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;Configuration public class TaskSchedulerConfig {Bean(destroyMe…...

linux perf
perf是Linux性能分析工具的集合,它提供了丰富的命令来收集和分析程序运行时的性能数据。perf能够报告CPU使用率、缓存命中率、分支预测成功率等多种硬件级别的事件,同时也支持软件级别的事件,如页面错误、任务切换等。perf是理解程序性能瓶颈…...

Linux--网络层IP
IP协议 IP协议,全称Internet Protocol(互联网协议),是TCP/IP协议族中的核心协议之一,用于在互联网络上进行数据的传输。IP协议的主要功能是确保数据从一个网络节点(如计算机、服务器、路由器等)…...

浅谈vite之import.meta
一. 解析 开发者使用一个模块时,有时需要知道模板本身的一些信息(比如模块的路径)。现在有一个提案,为 import 命令添加了一个元属性 import.meta,返回当前模块的元信息。 import.meta只能在模块内部使用,如…...

【Pytorch实用教程】Pytorch中nn.Sequential的用法
nn.Sequential 是 PyTorch 中用于构建神经网络的一种容器类,它可以按顺序封装多个子模块(层),并依次将输入数据传递给这些子模块。这样可以简化模型的定义,使得代码更加简洁和易读。 文章目录 基本用法方法一:直接传递子模块方法二:使用 `OrderedDict`动态构建模型优点注…...

Shopify被封?Shopify店铺开店到防封全面指南
Shopify,作为独立电商建站领域的佼佼者,其SaaS模式简化了建站流程,无需编程背景即可创建线上店铺,吸引了众多商家的目光。本文将详细讲解Shopify店铺从注册、运营到防封的每一个关键环节,为商家提供一站式指导…...

11. 盛最多水的容器
一题目: 二:代码: class Solution { public:int maxArea(vector<int>& height) {int l0;int rheight.size()-1;int ans0;while(l<r){int a(r-l)*min(height[l],height[r]);ansmax(ans,a);if(height[l]<height[r]) l;else r-…...

react如何父子组件传参
在React中,父子组件之间的传参主要通过props(属性)来实现。子组件通过props接收来自父组件的数据,而父组件则可以通过在子组件标签上设置属性(即props)来传递数据。下面是一个简单的例子来说明这个过程。 …...

【C++】二维数组 数组名
二维数组名用途 1、查看所占内存空间 2、查看二维数组首地址 针对第一种用途,还可以计算数组有多少行、多少列、多少元素 针对第二种用途,数组元素、行数、列数都是连续的,且相差地址是有规律的 下面是一个实例 #include<iostream&g…...

【蘑菇书EasyRL】强化学习,笔记整理
【蘑菇书EasyRL】强化学习,笔记整理 1.笔记整理1.1 学习和决策代码框架 2. 遇到的buggym 环境,新版本python无法使用env_specs envs.registry.all() 报错 蘑菇书的教程地址: https://datawhalechina.github.io/easy-rl/#/chapter1/chapter1?…...

尚硅谷谷粒商城项目笔记——三、安装docker【电脑CPU:AMD】
三、安装docker 注意: 因为电脑是AMD芯片,自己知识储备不够,无法保证和课程中用到的环境一样,所以环境都是自己根据适应硬件软件环境重新配置的,这里的虚拟机使用的是VMware。 首先关闭防火墙和安全策略 systemctl…...

【8-9月份唯一机械电气计算机主题的IEEE会议】第七届机电一体化与计算机技术工程国际学术会议(MCTE 2024,8月23-25)
由广东博士创新发展促进会、输变电装备技术全国重点实验室联合主办,重庆大学电气工程学院、AEIC学术交流中心协办的第七届机电一体化与计算机技术工程国际学术会议(MCTE 2024)将于2024年8月23-25日在中国广州隆重举行。 大会诚挚邀请您投递相…...

YOLOv8改进 | 主干网络 | 简单而优雅且有效的VanillaNet 【华为诺亚方舟】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有80+篇内容,内含各种Head检测头、损失函数Loss、…...

Tomcat高可用集群(实例详解)
一.环境准备 虚拟机的版本:VMware-workstation-full-15.5.6-16341506.exe系统镜像版本:CentOS-6.10-x86_64-bin-DVD1.iso,全新安装,桌面版,可上网系统内存大小:1GB系统硬盘大小:20GB连接工具版…...

搭建自己的金融数据源和量化分析平台(五):更新两市退市股票信息
在前面的股票列表设计中,我们有一个list_status字段,可能的值为L上市 D退市 P暂停上市。 由于股票可能会被退市,因此需要该字段来维护上市状态。 深市爬虫: # 读取深交所最新退市股票列表 def get_delisted_stock_list():cache_f…...