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中的结构的主要内容,如果未能解决你的问题,请参考以下文章

windows进程中的内存结构(好多API,而且VC最聪明)

电脑硬件信息啥是唯一的,或者不容易修改的。

intel1217/1218网卡驱动怎么安装

Lucene全文搜索原理与使用

第三篇-分析日志和sensor-data中的数据结构

如何通过api将文本文档(ODT或DOCX)中的表格导出为EMF格式