C#调用Windows API之参数类型浅析

网友投稿 260 2023-05-28

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)]   publicclass MySystemTime    {   [FieldOffset(0)]publicushort wYear;    [FieldOffset(2)]publicushort wMonth;   [FieldOffset(4)]publicushort wDayOfWeek;    [FieldOffset(6)]publicushort wDay;    [FieldOffset(8)]publicushort wHour;    [FieldOffset(10)]publicushort wMinute;    [FieldOffset(12)]publicushort wSecond;    [FieldOffset(14)]publicushort wMilliseconds;    }   1.2.3.4.5.6.7.8.9.10.11.12.13.

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 )]      publicclass OSVersionInfo    {      publicint OSVersionInfoSize;   publicint majorVersion;    publicint minorVersion;   publicint buildNumber;   publicint platformId;   [ MarshalAs( UnmanagedType.ByValTStr,    SizeConst=128 )]       public String versionString;   }   //或者 //.net中声明为结构 [ StructLayout( LayoutKind.Sequential )]     publicstruct OSVersionInfo2    {   publicint OSVersionInfoSize;   publicint majorVersion;    publicint minorVersion;   publicint buildNumber;   publicint platformId;   [ MarshalAs( UnmanagedType.ByValTStr,    SizeConst=128 )]       public String versionString;   }   1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.

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

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

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

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

复制[ DllImport( "kernel32",    EntryPoint="GetVersionEx" )]    publicstaticexternbool GetVersionEx2( ref OSVersionInfo2 osvi );    1.2.3.4.5.6.

C#调用Windows API之参数类型基本的情况就是这样子的,希望通过介绍对你了解和学习C#调用Windows API之参数类型有所帮助。

【编辑推荐】

C# Windows CE特点之可移植性 C# Windows CE特点之兼容性 C# Windows CE特点之可连接性 C# Windows CE特点之实时性 C#调用Windows API之调用格式浅析

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:假期开启,APISpace暑 ‘价’ 来袭
下一篇:APIApace 将图片转换成素描画API
相关文章

 发表评论

暂时没有评论,来抢沙发吧~