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

开发 后端
C#调用Windows API之参数类型主要是向你介绍了C#调用Windows API中参数类型的基本情况和使用方法,希望对你了解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 指示此字段在类型中的位置。如:

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

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

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

  1. /**********************************************  
  2. * API中定义原结构声明  
  3. * OSVERSIONINFOA STRUCT  
  4. *  dwOSVersionInfoSize   DWORD      ?  
  5. *  dwMajorVersion        DWORD      ?  
  6. *  dwMinorVersion        DWORD      ?  
  7. *  dwBuildNumber         DWORD      ?  
  8. *  dwPlatformId          DWORD      ?  
  9. *  szCSDVersion          BYTE 128 dup (?)  
  10. * OSVERSIONINFOA ENDS  
  11. *  
  12. * OSVERSIONINFO  equ  <OSVERSIONINFOA>  
  13. *********************************************/   
  14.  
  15.  
  16.  
  17. //.net中声明为类  
  18. [ StructLayout( LayoutKind.Sequential )]     
  19. public class OSVersionInfo   
  20. {     
  21. public int OSVersionInfoSize;  
  22. public int majorVersion;   
  23. public int minorVersion;  
  24. public int buildNumber;  
  25. public int platformId;  
  26. [ MarshalAs( UnmanagedType.ByValTStr,   
  27. SizeConst=128 )]      
  28. public String versionString;  
  29. }  
  30. //或者  
  31. //.net中声明为结构  
  32. [ StructLayout( LayoutKind.Sequential )]    
  33. public struct OSVersionInfo2   
  34. {  
  35. public int OSVersionInfoSize;  
  36. public int majorVersion;   
  37. public int minorVersion;  
  38. public int buildNumber;  
  39. public int platformId;  
  40.  
  41. [ MarshalAs( UnmanagedType.ByValTStr,   
  42. SizeConst=128 )]      
  43. public String versionString;  
  44. }  

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

  1. [MarshalAs(UnmanagedType.LPStr)]  
  2. String existingfile;  
  3. [MarshalAs(UnmanagedType.LPStr)]  
  4. String newfile;  

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

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

  1. [ DllImport( "kernel32",  
  2.  
  3.  EntryPoint="GetVersionEx" )]   
  4. public static extern bool   
  5.  
  6. GetVersionEx2( ref OSVersionInfo2 osvi );   

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

【编辑推荐】

  1. C# Windows CE特点之可移植性
  2. C# Windows CE特点之兼容性
  3. C# Windows CE特点之可连接性
  4. C# Windows CE特点之实时性
  5. C#调用Windows API之调用格式浅析
责任编辑:仲衡 来源: csdn
相关推荐

2009-08-17 13:18:01

C#调用Windows

2009-08-17 13:49:20

C#中调用Window

2009-08-24 14:51:25

C# 泛型泛型类型

2009-07-31 16:12:10

Windows APIC#

2009-08-03 13:34:57

C#调用Windows

2009-08-24 15:02:05

C# 类型

2009-08-04 09:30:33

C#调用ImageAn

2009-08-25 16:16:27

C#调用Windows

2009-08-25 17:59:49

C#入门

2009-08-12 10:35:50

C#调用ActiveX

2009-08-14 09:15:28

C#调用构造函数

2009-07-31 17:28:35

C#语言调用DLL

2009-08-18 12:52:33

C#枚举类型

2009-08-06 10:14:15

C#引用类型数组

2009-08-18 10:35:46

C#枚举类型

2009-08-06 17:57:14

C# webServiC# WebServi

2009-08-03 13:13:52

C#调用Outlook

2009-08-05 15:10:19

C#调用GoogleE

2009-08-07 16:10:20

C#调用API

2009-08-28 15:57:56

C#线程传递参数
点赞
收藏

51CTO技术栈公众号