27.3 API中的结构
Posted VB.Net
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了27.3 API中的结构相关的知识,希望对你有一定的参考价值。
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
通常而言,Vb6的类型(Type)转为VB.Net的结构(Structure)按照27.2节中类型转换的方法,把C类型直接更换为VB.Net类型即可。
通过调用API函数GetVersionEx可以获得操作系统的版本信息。该函数的参数是一个OSVERSIONINFOEx结构:
C原型(该结构的详细信息请参看MSDN):
typedef struct _OSVERSIONINFOEX
DWORD dwOSVersionInfoSize;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
TCHAR szCSDVersion[128];
WORD wServicePackMajor;
WORD wServicePackMinor;
WORD wSuiteMask;
BYTE wProductType;
BYTE wReserved;
OSVERSIONINFOEX, *POSVERSIONINFOEX, *LPOSVERSIONINFOEX;
附结构成员说明:
dwOSVersionInfoSize:结构大小,在使用之前需要将此成员设置为OSVERSIONINFOEX结构的大小。
dwMajorVersion:系统主版本号。
dwMinorVersion:系统次版本号。
dwBuildNumber:系统构建号。
dwPlatformId:系统支持的平台。
szCSDVersion:系统补丁包的名称。
wServicePackMajor:系统补丁包的主版本。
wServicePackMinor:系统补丁包的次版本。
wSuiteMask:标识系统上的程序组。
wProductType:标识系统类型。
wReserved:保留,未使用。
在VB6中的类型:
public Type OSVERSIONINFOEx
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
wServicePackMajor As Integer
wServicePackMinor As Integer
wSuiteMask As Integer
wProductType As Byte
wReserved As Byte
End Type
在VB.Net中的结构:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)>
Structure OSVERSIONINFOEx
Public dwOSVersionInfoSize As Int32
Public dwMajorVersion As Int32
Public dwMinorVersion As Int32
Public dwBuildNumber As Int32
Public dwPlatformId As Int32
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public szCSDVersion As String
Public wServicePackMajor As Int16
Public wServicePackMinor As Int16
Public wSuiteMask As Int16
Public wProductType As Byte
Public wReserved As Byte
End Structure
在OSVERSIONINFOEx结构中使用了StructLayout类和MarshalAsAttribute类,请先在所有代码前面加上:
Imports System.Runtime.InteropServices
StructLayout类对结构和类起作用,它的常用成员:
LayoutKind:控制当导出到非托管代码时对象的布局,有三个成员:Auto、Explicit、Sequential,通常使用Sequential。
CharSet:字符串使用的字符集,成员:Ansi、Auto、Unicode。需要根据API函数和结构原型进行选择。
MarshalAsAttribute类对结构和类中的成员起作用,它的常用成员:
UnmanagedType:枚举,指定如何将参数或字段封送到非托管代码,成员比较多。常用的包括ByValTStr(当结构中该成员为字符串,并需要SizeConst字段配合来指示大小)、ByValArray(当结构中该字段为数组时)等。
SizeConst:固定长度数组中的元素数,或要导入的字符串中的字符(不是字节)数,通常配合ByValTStr、ByValArray进行设置。例如VB6的OSVERSIONINFOEx类型中,第6个成员是一个固定长度的字符串:szCSDVersion As String * 128,那么相应的在VB.Net中OSVERSIONINFOEx结构第6个成员使用了<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public szCSDVersion As String。
【例 27A.3】【项目:code27A-003】获得Windows系统版本信息。
通过调用API函数GetVersionEx可以获得操作系统的版本信息,但是这个API函数对Win8.1之后版本不可用,返回的值为6.2.xxxx,即Win8.1的版本。而另外一个API函数RtlGetVersion则不受影响。两个函数都使用OSVERSIONINFOEx结构作为参数。
在本例中仍然使用了GetVersionEx做演示,同时也使用了RtlGetVersion获得操作系统正确的版本信息。具体代码如下:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi)>
Structure OSVERSIONINFOEx
Public dwOSVersionInfoSize As Int32
Public dwMajorVersion As Int32
Public dwMinorVersion As Int32
Public dwBuildNumber As Int32
Public dwPlatformId As Int32
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=128)> Public szCSDVersion As String
Public wServicePackMajor As Int16
Public wServicePackMinor As Int16
Public wSuiteMask As Int16
Public wProductType As Byte
Public wReserved As Byte
End Structure
Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (ByRef osvi As OSVERSIONINFOEx) As Integer
Public Declare Function RtlGetVersion Lib "ntdll.dll" (ByRef osvi As OSVERSIONINFOEx) As Integer
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim result As Integer
Dim osInfo As New OSVERSIONINFOEx
osInfo.dwOSVersionInfoSize = Marshal.SizeOf(osInfo)
result = GetVersionEx(osInfo)
If result <> 0 Then
MessageBox.Show("GetVersionEx获得系统版本号:" & osInfo.dwMajorVersion & "." & osInfo.dwMinorVersion & "." & osInfo.dwBuildNumber)
End If
Dim osInfo1 As New OSVERSIONINFOEx
result = RtlGetVersion(osInfo1)
If result >= 0 Then
MessageBox.Show("RtlGetVersion获得系统版本号:" & osInfo1.dwMajorVersion & "." & osInfo1.dwMinorVersion & "." & osInfo1.dwBuildNumber)
End If
End Sub
运行结果如下图所示:
图27A-3 获得Windows系统版本信息
由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。
学习更多vb.net知识,请参看vb.net 教程 目录
以上是关于27.3 API中的结构的主要内容,如果未能解决你的问题,请参考以下文章