在中运用函数获取系统呢

液压机械/部件2021年09月06日

API函数是构筑Windows应用程序的基石,是Windows编程的必备利器。每一种Windows应用程序开发工具都提供了间接或直接调用了Windows API函数的方法,或者是调用Windows API函数的接口,也就是说具备调用动态连接库的能力。Visual C#和其它开发工具一样也能够调用动态链接库的API函数。本文中笔者就结合实例向大家介绍在Visual C#中如何调用各种返回值的API,该实例就是一个通过API函数调用获取系统信息的程序。

在Visual C#中调用API的基本过程:

首先,在调用API之前,你必须先导入eropServices这个名称空间。该名称空间包含了在Visual C#中调用API的一些必要集合,具体的方法如下:

using eropServices;

在导入了名称空间后,我们要声明在程序中所要用到的API函数。我们的程序主要是获取系统的相关信息,所以用到的API函数都是返回系统信息的。先给出在Visual C#中声明API的方法:

[DllImport(\"kernel32\")]

public static extern void GetWindowsDirectory(StringBuilder WinDir,int count);

其中,\"DllImport\"属性用来从不可控代码中调用一个方法,它指定了DLL的位置,该DLL中包含调用的外部方法;\"kernel32\"设定了类库名;\"public\"指明函数的访问类型为公有的;\"static\"修饰符声明一个静态元素,而该元素属于类型本身而不是指定的对象;\"extern\"表示该方法将在工程外部执行,同时使用DllImport导入的方法必须使用\"extern\"修饰符;最后GetWindowsDirectory函数包含了两个参数,一个为StringBuilder类型的,另一个为int类型的,该方法返回的内容存在于StringBuilder类型的参数中。同时,因为我们在这里使用到了StringBuilder类,所以在程序的开始处,我们还得添加xt这个名称空间,方法同上。

其他几个API函数的声明如下:

[DllImport(\"kernel32\")]

public static extern void GetSystemDirectory(StringBuilder SysDir,int count);

[DllImport(\"kernel32\")]

public static extern void GetSystemInfo(ref CPU_INFO cpuinfo);

[DllImport(\"kernel32\")]

public static extern void GlobalMemoryStatus(ref MEMORY_INFO meminfo);

[DllImport(\"kernel32\")]

public static extern void GetSystemTime(ref SYSTEMTIME_INFO stinfo);

以上几个API的作用分别是获取系统路径,获得CPU相关信息,获得内存的相关信息,获得系统时间等。

在声明完所有的API函数后,我们发现后三个函数分别用到了CPU_INFO、MEMORY_INFO、SYSTEMTIME_INFO等结构,这些结构并非是.Net内部的,它们从何而来?其实,我们在用到以上API调用时均需用到以上结构,我们将函数调用获得的信息存放在以上的结构体中,最后返回给程序输出。这些结构体比较复杂,但是如果开发者能够熟练运用,那么整个API世界将尽在开发者的掌握之中。以下就是上述结构体的声明:

//定义以下各结构

//定义CPU的信息结构

[StructLayout(quential)]

public struct CPU_INFO

{

public uint dwOemId;

public uint dwPageSize;

public uint lpMinimumApplicationAddress;

public uint lpMaximumApplicationAddress;

public uint dwActiveProcessorMask;

public uint dwNumberOfProcessors;

public uint dwProcessorType;

public uint dwAllocationGranularity;

public uint dwProcessorLevel;

public uint dwProcessorRevision;

}

//定义内存的信息结构

近年来 [StructLayout(quential)]

public struct MEMORY_INFO

{

public uint dwLength;

public uint dwMemoryLoad;

public uint dwTotalPhys;

public uint dwAvailPhys;

public uint dwTotalPageFile;

public uint dwAvailPageFile;

public uint dwTotalVirtual;

public uint dwAvailVirtual;

}

//定义系统时间的信息结构

[StructLayout(quential)]

public struct SYSTEMTIME_INFO

{

public ushort wYear;

public ushort wMonth;

public ushort wDayOfWeek;

public ushort wDay;

public ushort wHour;

public ushort wMinute;

public ushort wSecond;

public ushort wMilliseconds;

}

结构体定义的主体部分和C++中的没多大差别,具体每个结构体内部成员的定义可参考联机帮助中的SDK文档。同时,我们还发现在每个结构体定义的上面都有一句用中括号括起来的说明性文字。这些说明都是有关结构体成员的布局的,共有三种选项,分别说明如下:

tomatic:为了提高效率允许运行态对类型成员重新排序。

注意:永远不要使用这个选项来调用不受管辖的动态链接库函数。

plicit:对每个域按照FieldOffset属性对类型成员排序

quential:对出现在受管辖类型定义地方的不受管辖内存中的类型成员进行排序。

在上面的程序中,为了方便起见我们都用到了第三种方式。

南昌男科医院在哪
西安治男科专科医院
武汉盆腔炎
相关阅读
阵容顶级,全员戏骨,又一部扫黑大剧要来了,张译出品

张译,男主角的《觉醒之四门》正因如此成了这一时期的后起之秀正因如此。...

2023-09-23
亚马逊Fire 7平板的电脑将搭载Fire OS操作系统,升级Android 11

IT之家 5 月 22 日消息,雨林新款机壳电脑 Fire 7 将搭载该公司的 Fire OS UNIX的新...

2023-09-19
4.2亿元!晋中又一轮消费券来了,5月21日开抢

4.2亿元!大同又一轮奢侈品劵来了,5年底21日开放 ▲新闻网招待会到场 大...

2023-09-18
夏季是色彩的狂欢!愿这些五彩斑斓的壁纸能灿烂你的夏末

就像渴望傍晚的傍晚 就像渴望星空下的凉风 傍晚的我们在放画中的 乐趣恣意...

2023-09-16
创下两个首次!粤港澳大湾区直流背靠背电网工程建成 电网可靠性大幅提升

央视网消息:今天(5月末21日),当今上容量最大、首次在的电力负载中心实...

2023-09-12
共赏盛夏奇观!vivo S15系列快闪大型活动来袭,热闹非凡

就在日前,vivo另一款了全新的#vivo S15#复刻版APP,欣赏了网友们的关注。为了...

2023-09-08
友情链接