C#调用WindowsAPI之参数类型的示例分析-成都快上网建站

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

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

创新互联是一家专业提供泰山企业网站建设,专注与做网站、成都做网站H5网站设计、小程序制作等业务。10年已为泰山众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。

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    *********************************************/      //.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之参数类型的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


分享文章:C#调用WindowsAPI之参数类型的示例分析
标题来源:http://kswjz.com/article/pdipdh.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流