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之调用格式浅析
暂时没有评论,来抢沙发吧~