温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#调用Windows API之参数类型的示例分析

发布时间:2021-12-01 15:59:16 来源:亿速云 阅读:144 作者:小新 栏目:编程语言

小编给大家分享一下C#调用Windows API之参数类型的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

C#调用Windows API之参数类型1、

数值型直接用对应的就可。

(DWORD -> int , WORD -> Int16)

C#调用Windows API之参数类型2、

API中字符串指针类型 -> .net中string

C#调用Windows API之参数类型3、

API中句柄 (dWord)  -> .net中IntPtr

C#调用Windows API之参数类型4、

API中结构   -> .net中结构或者类。注意这种情况下,要先用StructLayout特性限定声明结构或类

公共语言运行库利用StructLayoutAttribute控制类或结构的数据字段在托管内存中的物理布局,即类或结构需要按某种方式排列。如果要将类传递给需要指定布局的非托管代码,则显式控制类布局是重要的。它的构造函数中用LayoutKind值初始化 StructLayoutAttribute 类的新实例。 LayoutKind.Sequential 用于强制将成员按其出现的顺序进行顺序布局。

LayoutKind.Explicit 用于控制每个数据成员的精确位置。利用 Explicit, 每个成员必须使用 FieldOffsetAttribute 指示此字段在类型中的位置。如:

[StructLayout(LayoutKind.Explicit,   Size=16, CharSet=CharSet.Ansi)]  public class MySystemTime   {  [FieldOffset(0)]public ushort wYear;   [FieldOffset(2)]public ushort wMonth;  [FieldOffset(4)]public ushort wDayOfWeek;   [FieldOffset(6)]public ushort wDay;   [FieldOffset(8)]public ushort wHour;   [FieldOffset(10)]public ushort wMinute;   [FieldOffset(12)]public ushort wSecond;   [FieldOffset(14)]public ushort wMilliseconds;   }

C#调用Windows API之参数类型实例说明:

下面是针对API中OSVERSIONINFO结构,在.net中定义对应类或结构的例子:

/**********************************************  * API中定义原结构声明  * OSVERSIONINFOA STRUCT  *  dwOSVersionInfoSize   DWORD      ?  *  dwMajorVersion        DWORD      ?  *  dwMinorVersion        DWORD      ?  *  dwBuildNumber         DWORD      ?  *  dwPlatformId          DWORD      ?  *  szCSDVersion          BYTE 128 dup (?)  * OSVERSIONINFOA ENDS  *  * OSVERSIONINFO  equ  <OSVERSIONINFOA>  *********************************************/      //.net中声明为类  [ StructLayout( LayoutKind.Sequential )]     public class OSVersionInfo   {     public int OSVersionInfoSize;  public int majorVersion;   public int minorVersion;  public int buildNumber;  public int platformId;  [ MarshalAs( UnmanagedType.ByValTStr,   SizeConst=128 )]      public String versionString;  }  //或者  //.net中声明为结构  [ StructLayout( LayoutKind.Sequential )]    public struct OSVersionInfo2   {  public int OSVersionInfoSize;  public int majorVersion;   public int minorVersion;  public int buildNumber;  public int platformId;   [ MarshalAs( UnmanagedType.ByValTStr,   SizeConst=128 )]      public String versionString;  }

此例中用到MashalAs特性,它用于描述字段、方法或参数的封送处理格式。用它作为参数前缀并指定目标需要的数据类型。例如,以下代码将两个参数作为数据类型长指针封送给 Windows API 函数的字符串 (LPStr):

[MarshalAs(UnmanagedType.LPStr)]  String existingfile;  [MarshalAs(UnmanagedType.LPStr)]  String newfile;

C#调用Windows API之参数类型注意事项:

注意结构作为参数时候,一般前面要加上ref修饰符,否则会出现错误:对象的引用没有指定对象的实例。

[ DllImport( "kernel32",    EntryPoint="GetVersionEx" )]   public static extern bool    GetVersionEx2( ref OSVersionInfo2 osvi );

以上是“C#调用Windows API之参数类型的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI