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 <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;
- [ 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#调用Windows API之参数类型有所帮助。
【编辑推荐】