学院首页>网络编程>ASP.NET>C#中调用Windows API的要点

C#中调用Windows API的要点

作者: 来源: 添加时间:2006-5-21 20:00:37
二、参数类型:

  1、数值型直接用对应的就可。(DWORD -> int , WORD -> Int16)
  2、API中字符串指针类型 -> .net中string
  3、API中句柄 (dWord)  -> .net中IntPtr
  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;
  }
  下面是针对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 )]  
  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;

第 2 页,共 3 页 [1] [2] [3]
站内搜索