C#调用WindowsAPI之参数类型浅析

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    
  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之参数类型有所帮助。

分享文章:C#调用WindowsAPI之参数类型浅析
文章网址:http://www.shufengxianlan.com/qtweb/news8/440858.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联