千家信息网

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

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,小编给大家分享一下C#调用Windows API之参数类型的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!C#调用
千家信息网最后更新 2026年11月02日C#调用Windows API之参数类型的示例分析

小编给大家分享一下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    *********************************************/      //.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# 布局 数据 字段 实例 成员 篇文章 控制 示例 分析 中用 代码 位置 内容 函数 字符 字符串 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 什么是科技互联网 关于新基建和互联网科技 互联网 科技创业 礼当家互联网科技 狮子座互联网科技有限公司 中国互联网金融科技基金 互联网金融监管科技 华中科技有哪些互联网大佬 安控科技rtu产品工业互联网 科技与互联网的利与弊 字节跳动和互联网科技 以后互联网后是啥科技 浙江互联网科技研学营 允成互联网科技有限公司融资 用友工业互联网科技发展 锡山区互联网智能科技产品供应 江苏互联网科技小贷 互联网科技手机排行榜 互联网金融金融科技 颐高云石互联网科技 互联网科技园 广东万易互联网科技有限公司惠州分公司 字节跳动和互联网科技 重庆互联网医院沙龙医盟信息科技 湖北码尼互联网科技有限公司电话 宝灵互联网科技有限公司 互联网硬科技公司 萌小萌互联网科技河南有限公司 科技互联网专业务虚会材料 安徽九吞吴互联网科技有限公司
0